代码如下。 CWnd *pCWnd;
pCWnd=FindWindow(NULL,"无标题 - 记事本"); //公式
if(hWnd)
{
pCWnd->SetWindowPos(NULL, 0, 0, 100, 100, SWP_NOSIZE);
Sleep(1000);
pCWnd->SendMessage(WM_KEYDOWN, VK_F1, 0);
pCWnd->SendMessage(WM_KEYUP, VK_F1, 0);
}
else
{
AfxMessageBox("没有找到这个窗口");
}
目的是在个窗口按下F1键。另附问:
为什么VK_F1等键能用,而VK_0之类的键,发送不过去呢?还是别的原因?
pCWnd=FindWindow(NULL,"无标题 - 记事本"); //公式
if(hWnd)
{
pCWnd->SetWindowPos(NULL, 0, 0, 100, 100, SWP_NOSIZE);
Sleep(1000);
pCWnd->SendMessage(WM_KEYDOWN, VK_F1, 0);
pCWnd->SendMessage(WM_KEYUP, VK_F1, 0);
}
else
{
AfxMessageBox("没有找到这个窗口");
}
目的是在个窗口按下F1键。另附问:
为什么VK_F1等键能用,而VK_0之类的键,发送不过去呢?还是别的原因?
发送VK_0则要先获得记事本EDIT子窗口的句柄,然后把VK_0的按键消息发送给它就可以了
#include <iostream>
#include <windows.h>
using namespace std;int main(int argc, char *argv[])
{
HWND hWnd = FindWindow(NULL, "无标题 - 记事本");
HWND hEdit = FindWindowEx(hWnd, NULL, "Edit", NULL);
PostMessage(hEdit, WM_KEYDOWN, 0x41, 0);
PostMessage(hEdit, WM_KEYUP, 0x41, 0);
system("PAUSE");
return EXIT_SUCCESS;
}我写的一段代码,但是不知道为什么每次都是两个a(0x41的代码是a)
是不是我的SendMessage用错了?VK_0查了一下winuser.h没有定义,需要自己弄,这一点明白了。
不知道,原来还可以这样用,这个方法不错,编辑区的窗口名叫Edit
下列代码
PostMessage(hEdit, WM_KEYDOWN, 0x41, 0);
PostMessage(hEdit, WM_KEYUP, 0x41, 0);
改为DWORD dwVKFkeyData;
WORD dwScanCode =MapVirtualKey(VK_F1,0);//VK_F1 dwVKFkeyData = 1;
dwVKFkeyData |= dwScanCode<<16;
dwVKFkeyData |= 0<<24;
dwVKFkeyData |= 1<<29;
//按下
::PostMessage(hEdit,WM_KEYDOWN,VK_F1,dwVKFkeyData); //弹起
dwVKFkeyData |= 3 << 30;
::PostMessage(hEdit,WM_KEYUP,VK_F1,dwVKFkeyData);
还是说不能用SendMessage?
或者说一下SendMessage怎么实现?
消息循环的代码:
while(GetMessage){TranslateMessage,DispatchMessage}
如果GetMessage收到SendMessage发的消息就直接用KeUserModeCallback降到用户模式,调用窗口过程,然后再跳回去等如果GetMessage收到PostMessage发的消息就返回,经过TranslateMessage,再由DispatchMessage调用窗口过程Edit控件的窗口过程遇到WM_CHAR就把对应的字符显示出来,不是WM_KEYDOWNTranslateMessage见到WM_KEYDOWN就post一个对应的WM_CHAR因此用WM_KEYDOWN往Edit控件发按键只能用PostMessage