我先用findwindow找到了hwnd然后PostMessage(hwnd,WM_CHAR,'2',0);
但是我用記事本來試驗都無法成功鍵入字符
uj5u.com熱心網友回復:
你要鍵入字符要查找的不只是表單,找到表單以后還要找到里面的編輯框組件,用spy++看一下記事本,記事本里面就只有一個編輯框,一個狀態欄。先通過FindWindow找到表單的句柄,然后通過FindWindowEx找到記事本表單里面的編輯框的句柄,向編輯框組件發送字符就能夠顯示
HWND formHandle=NULL;
HWND childHandle=NULL;
formHandle=FindWindow(NULL,"記事本表單名字");
if(formHandle==NULL) return;
childHandle=FindWindowEx(formHandle,NULL,NULL,NULL);//看spy++,第一個子句柄就是編輯框,找到這個句柄,就可以發送訊息了
if(childHandle==NULL) return;
PostMessage(childHandle,WM_CHAR,'2',0);//這里發送訊息就能在記事本的編輯框里面顯示了
uj5u.com熱心網友回復:
要找到對應的輸入文本的視窗句柄,然后就是有些視窗并不支持你發送的訊息也顯示不出來uj5u.com熱心網友回復:
WM_CHAR訊息并不是都支持, 有可能需要發送WM_KEYDOWN 和WM_KEYUP才行uj5u.com熱心網友回復:
確保找到了正確的視窗句柄
BOOL SendCharToNotepand(UINT vKey)
{
BOOL bRet = FALSE;
HWND hNotePad = FindWindow(_T("Notepad"), NULL);
HWND hEdit = FindWindowEx(hNotePad, NULL, _T("Edit"), NULL);
if(hEdit)
{
bRet = ::PostMessage(hEdit, WM_CHAR, vKey, 0);
}
return bRet;
}
uj5u.com熱心網友回復:
keybd_event()/SendInput()模擬按鍵~uj5u.com熱心網友回復:
列子:
//
LPARAM MakeKeyLparam1(int VirtualKey, int flag)
{
LPARAM s;
unsigned char firstByte;
// if (flag == WM_KEYDOWN) firstByte = 0;
// else firstByte = 0xc0;
switch (flag)
{// 16–23 Specifies the scan code.
case WM_KEYDOWN: firstByte = 0; break;// 0000 0000
case WM_KEYUP: firstByte = 0xC0;break;// 1100 0000
case WM_CHAR: firstByte = 0x20;break;// 0010 0000
case WM_SYSKEYDOWN: firstByte = 0x20;break;
case WM_SYSKEYUP: firstByte = 0xE0;break;// 1110 0000
case WM_SYSCHAR: firstByte = 0xE0;break;// 1110 0000
}
//
int scanCode;
scanCode = MapVirtualKey(VirtualKey, 0);
afxDump << VirtualKey << ";" << scanCode << "\n";
//
unsigned char secondByte;
secondByte = scanCode & 0xff;
s = (firstByte << 24) | (secondByte << 16) | 0x0001;
//
return s;
}
void CToNotePadDlg::OnButton1()
{
// TODO: Add your control notification handler code here
HWND hwnd=::FindWindow("NotePad","無標題 - 記事本");
if( hwnd)
{
// ::BringWindowToTop(hwnd);
#if 0 // Alt+F
// keybd_event(VK_MENU,0,0,0);
// keybd_event('F',0,0,0);
// keybd_event('F',0,KEYEVENTF_KEYUP,0);
// keybd_event(VK_MENU,0,KEYEVENTF_KEYUP,0);
// CTRL+O
keybd_event(VK_CONTROL,0,0,0);
keybd_event('O',0,0,0);
keybd_event('O',0,KEYEVENTF_KEYUP,0);
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
// ::PostMessage(hwnd, WM_COMMAND,MAKEWPARAM(2,BN_CLICKED),NULL);//打開“打開”對話框 //第2句
Sleep(100);
hwnd=::FindWindow(NULL,"打開");
// 1148 = 0x47C cmb13 ComboBoxEx32
HWND hCmb13 = ::GetDlgItem(hwnd,0x047C);
if(hCmb13)
{
Sleep(500);
::SendMessage(hCmb13,WM_SETTEXT,0,(LPARAM)"abc.txt");
}
#else // OK
//WM_SYSKEYDOWN
//nVirtKey = (int) wParam; // virtual-key code
//lKeyData = lParam; // key data
// Alt+F must
::PostMessage(hwnd, WM_SYSKEYDOWN, VK_MENU, MakeKeyLparam(VK_MENU,WM_SYSKEYDOWN));
::PostMessage(hwnd, WM_SYSKEYDOWN, 'F', MakeKeyLparam('F',WM_SYSKEYDOWN));
::PostMessage(hwnd, WM_CHAR, 'F', MakeKeyLparam('F',WM_CHAR));
::PostMessage(hwnd, WM_SYSKEYUP, 'F', MakeKeyLparam('F',WM_SYSKEYUP));
::PostMessage(hwnd, WM_KEYUP, VK_MENU, MakeKeyLparam(VK_MENU,WM_KEYUP));
// Ctrl + O
// ::PostMessage(hwnd, WM_SYSKEYDOWN, VK_CONTROL, MakeKeyLparam1(VK_CONTROL,WM_SYSKEYDOWN));
// ::PostMessage(hwnd, WM_SYSKEYDOWN, 'O', MakeKeyLparam1('O',WM_SYSKEYDOWN));
// ::PostMessage(hwnd, WM_CHAR, 'O', MakeKeyLparam1('O',WM_CHAR));
// ::PostMessage(hwnd, WM_SYSKEYUP, 'O', MakeKeyLparam1('O',WM_SYSKEYUP));
// ::PostMessage(hwnd, WM_KEYUP, VK_CONTROL, MakeKeyLparam1(VK_CONTROL,WM_KEYUP));
// ::PostMessage(hwnd, WM_COMMAND,MAKEWPARAM(2,BN_CLICKED),NULL);//“打開”對話框
Sleep(110);
hwnd=::FindWindow(NULL,"打開");
// 1148 = 0x47C cmb13 ComboBoxEx32
HWND hCmb13 = ::GetDlgItem(hwnd,0x047C);
//
if(hCmb13)
{
Sleep(500);
::SendMessage(hCmb13,WM_SETTEXT,0,(LPARAM)"abc.txt");
}
#endif
}
}
uj5u.com熱心網友回復:
行程間的通信,你可以發送廣播訊息,HWND_BROADCAST轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/75391.html
標籤:基礎類
下一篇:多載屏蔽屬性
