用如下代码,可编辑框中没什么反应,错在哪呢?
DWORD Key;
LPARAM lpar;
WPARAM wpar;
HWND hwnd; hwnd=::GetDlgItem(m_hWnd,IDC_EDIT1);
Key=::OemKeyScan(0x61);//模拟按下a字符
wpar=::MapVirtualKey(Key & 0xff,1);
lpar=(Key &0xff)<<16;
lpar|=0x1;
::SendMessage(hwnd,WM_KEYDOWN,wpar,lpar);
DWORD Key;
LPARAM lpar;
WPARAM wpar;
HWND hwnd; hwnd=::GetDlgItem(m_hWnd,IDC_EDIT1);
Key=::OemKeyScan(0x61);//模拟按下a字符
wpar=::MapVirtualKey(Key & 0xff,1);
lpar=(Key &0xff)<<16;
lpar|=0x1;
::SendMessage(hwnd,WM_KEYDOWN,wpar,lpar);
VOID keybd_event(
BYTE bVk, // virtual-key code
BYTE bScan, // hardware scan code
DWORD dwFlags, // flags specifying various function options
DWORD dwExtraInfo // additional data associated with keystroke
);
VOID mouse_event(
DWORD dwFlags, // flags specifying various motion/click variants
DWORD dx, // horizontal mouse position or position change
DWORD dy, // vertical mouse position or position change
DWORD dwData, // amount of wheel movement
DWORD dwExtraInfo
// 32 bits of application-defined information
);
模拟代码(省略了很多代码):48为0键
...
for(int i=0;i<101;i++)
{
num[i] = 48;
if( 0 <= i && i <= 10)
{
static BYTE code = 48;
num[i] = code;
code++;
}
if( 10 < i && i <= 10 + 26)
{
static BYTE code = 65;
num[i] = code;
code++;
}
}
...
void CSimulateDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
static int count=0;
switch(nIDEvent)
{
case 1:
keybd_event(num[count],0,0,0);
keybd_event(num[count],0,KEYEVENTF_KEYUP,0);
count++; if(count >= sizeof(num)/sizeof(BYTE))
{
OnKeyboard();
KillTimer(1);
count = 0;
}
break;
case 2:
POINT lpPoint;
GetCursorPos(&lpPoint);
SetCursorPos(lpPoint.x, lpPoint.y);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
break;
default:
break;
}
CDialog::OnTimer(nIDEvent);
}
::PostMessage(hwnd,WM_KEYDOWN,wpar,lpar);
键盘消息WM_KEYDOWN就是属于被动的响应消息,而不是触发事件的。你可以参看关于的说明
再对比 WM_CLOSE, WM_QUIT等的说明