代码如下。 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之类的键,发送不过去呢?还是别的原因?

解决方案 »

  1.   

    你要先明白PostMessage和SendMessage的区别 ,一个是阻塞的一个是非阻塞的而你说的 VK_F1 VK_0两个,一个可能是已经实现的,另一个需要自己实现消息映射
      

  2.   

    VK_F1和VK_0的有区别是因为VK_0必须在记事本的EDIT子窗口下才有输入焦点,也就是说发送VK_0按键消息的窗口句柄是错误的。
    发送VK_0则要先获得记事本EDIT子窗口的句柄,然后把VK_0的按键消息发送给它就可以了
      

  3.   


    #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)
      

  4.   

    这个倒是知道区别,问题是为什么同样的条件下,SendMessage过去F1没有效果,而PostMessage过去的有效果呢?
    是不是我的SendMessage用错了?VK_0查了一下winuser.h没有定义,需要自己弄,这一点明白了。
      

  5.   


    不知道,原来还可以这样用,这个方法不错,编辑区的窗口名叫Edit
      

  6.   

    SendMessage直接发送到窗口过程,PostMessage是放进窗口的消息队列,你有没有拦截那F1消息呢?如果用SendMessage发送过去,你是拦截不到的。你只能拦截到消息队列里的消息。
      

  7.   

     0x41 本来就是虚拟健a
    下列代码
     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); 
      

  8.   

    虽然回答不少,但还是没有解决为什么SendMessage不行的问题
    还是说不能用SendMessage?
    或者说一下SendMessage怎么实现?
      

  9.   

    不能用SendMessage发WM_KEYDOWN,要发就发WM_CHAR
    消息循环的代码:
    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