1,用DialogBox创建的对话框如何捕捉WM_KEYDOWN和WM_KEYUP消息
MSDN上面说DialogBox创建的对话框用的是单独的消息循环,所以我没法修改TranslateMessage之前的代码2,如何向当前窗口中输入文字(可能是WINWORD,NOTEPAD,QQ……)
热键已经注册,问题是响应WM_HOTKEY的函数怎么写

解决方案 »

  1.   

    那就试试PreTranslateMessage吧,这样就可以捕捉WM_KEYDOWN和WM_KEYUP消息了.
      

  2.   

    我用的Windows SDK没用MFC啊……
      

  3.   


    模拟键盘我们用Keybd_event这个api函数。首先介绍一下Keybd_event函数。Keybd_event能触发一个按键事件,也就是说回产生一个WM_KEYDOWN或WM_KEYUP消息。当然也可以用产生这两个消息来模拟按键,但是没有直接用这个函数方便。Keybd_event共有四个参数,第一个为按键的虚拟键值,如回车键为vk_return, tab键为vk_tab。第二个参数为扫描码,一般不用设置,用0代替就行第三个参数为选项标志,如果为keydown则置0即可,如果为keyup则设成“KEYEVENTF_KEYUP”,第四个参数一般也是置0即可。用如下代码即可实现模拟按下键,其中的XX表示XX键的虚拟键值,在这里也就是各键对应的键码,如’A’=65 
    keybd_event(65,0,0,0); 
    keybd_event(65,0,KEYEVENTF_KEYUP,0);
      

  4.   

    MSDN上面说DialogBox创建的对话框用的是单独的消息循环所以有个DialogProc()呀,那个就是单独的消息循环,所有Dialog的消息在那里处理。
      

  5.   

    BOOL CALLBACK DialogProc(HWND hDlg,UINT msg,WPARAM wParam,LPARAM lParam);
    DialogBox(hInst,hwndParent,(LPCTSTR)IDD_DIALOG,(DLGPROC)DialgoPrpc);
    BOOL CALLBACK DialogProc(HWND hDlg,UINT msg,WPARAM wParam,LPARAM lParam)
    {
      switch(msg)
      {
        case WM_INITDIALOG:
           return TRUE;
        case WM_KEYDOWN:
            ....
           break;
         case WM_KEYUP:
           ....
           break;
         }
        return FALSE;}
      

  6.   

    to 楼上两位:DialogProc接到的是TranslateMessage之后的消息,WM_KEYDOWN和WM_KEYUP被过滤掉了,我就是在这个函数中无法捕捉WM_KEYDOWN和WM_KEYUPto aspnetwuxueyou(): 这个函数也是在消息循环中用的吧,可是我接触不到消息循环 :(to laiyiling(※陌生人·坚持理想※): 字符串中可能有中文,所以模拟键盘不太可取
    我想到的办法是利用剪贴板,发送WM_PASTE消息,可是又不知道怎么得到光标所在控件的句柄
    GetForegroundWindow只能得到最前面窗口的句柄
      

  7.   

    是我误解了,对话框过程是特殊处理的,消息经过过滤,和TranslateMessage也没有关系。要实现你的目的,可能只有自己用CreateWindow来模拟对话框了。