自己做的程序,想向后台的另一个程序发送alt+q的组合键
看过不少高手发的帖子
    ::SendMessage(bhWnd, WM_KEYDOWN, VK_Q,VK_ALT );
不能实现,请问为什么呀,请高手指教.
PS: 为什么在我的程序中提示error C2065: 'VK_ALT' : undeclared identifier
                          error C2065: 'VK_Q' : undeclared identifier
奇怪了?难道虚拟吗不能这样用吗?要加头文件吗?

解决方案 »

  1.   

    ::SendMessage(bhWnd, WM_CHAR, 'e', 0);
      我用上面这个能实现向后台程序发送数据的情况,,,,证明方法是没错的呀
      

  2.   

    winuser.h里面没有 VK_Q,VK_ALT 的定义。
    自己定义吧。
      

  3.   

    Alt键按下是系统键盘消息::SendMessage(bhWnd, WM_SYSKEYDOWN, 'Q',0x20000000);
      

  4.   

    刚才出去了一下   对不起呀
       我按照  jasonshark(最后一个暑假了...)  的办法添加了
     可是没有反应呀..
    举个简单列子
      我的程序控制打开的一个   文本文件
    我能往里面 用 ::SendMessage(bhWnd, WM_CHAR, 'e', 0); 添加字母进去
         可是我想用  ALT+E   打开后台状态的  文本文件的菜单 这个能实现吗?
     我用了   JASON的办法  不行呀,,,
      

  5.   

    难道 SENDMESSAGE发送组合件  只能给当前窗口吗
       要不要 做个钩子呀
      

  6.   

    给非活动窗口发送WM_SYSKEYDOWN可能是不行...
      

  7.   

    哎  折腾了一下午了  难道没有其他办法吗?
             以前玩UO的时候有个月光MONNLIGHT 工具软件 就是能后台挂几的....
           我这整了个源程序  可惜我看不懂......他是怎么实现的??
      我发出来吧...\
    //发送快捷键事件
    if(lb_event[i].vk!=-1)
    {
    lParam_keydown = DWORD(keyscancode<<16) + 1;
    lParam_keyup = DWORD(keyscancode<<16) + 1 + 0xC0000000;
    pWnd->PostMessage(WM_KEYDOWN,lb_event[i].vk,lParam_keydown);
    pWnd->PostMessage(WM_KEYUP,lb_event[i].vk,lParam_keyup);
    }
    //快捷键等待
    for(j=0;j<lb_event[i].keytime/100;j++)
    {
    if(LoopYield()==TRUE)
    return TRUE;
    Sleep(100);
    } //发送鼠标事件
    if(lb_event[i].msgdown==WM_LBUTTONDOWN)
    {
    pWnd->PostMessage(lb_event[i].msgdown,MK_LBUTTON,lParam);
    pWnd->PostMessage(lb_event[i].msgup,0,lParam);
    }
    if(lb_event[i].msgdown==WM_LBUTTONDBLCLK)
    {
    pWnd->PostMessage(WM_LBUTTONDOWN,MK_LBUTTON,lParam);
    pWnd->PostMessage(lb_event[i].msgup,0,lParam);
    pWnd->PostMessage(WM_LBUTTONDOWN,MK_LBUTTON,lParam);
    pWnd->PostMessage(lb_event[i].msgup,0,lParam);
    }
      

  8.   

    //发送快捷键事件
    if(lb_event[i].vk!=-1)
     { 
    lParam_keydown = DWORD(keyscancode<<16) + 1;
    lParam_keyup = DWORD(keyscancode<<16) + 1 + 0xC0000000;
    pWnd->PostMessage(WM_KEYDOWN,lb_event[i].vk,lParam_keydown);
    pWnd->PostMessage(WM_KEYUP,lb_event[i].vk,lParam_keyup);
    }
    //快捷键等待
    for(j=0;j<lb_event[i].keytime/100;j++)
    {
       if(LoopYield()==TRUE)
    return TRUE;
    Sleep(100);
    }//发送鼠标事件
    if(lb_event[i].msgdown==WM_LBUTTONDOWN)
                {  
    pWnd->PostMessage(lb_event[i].msgdown,MK_LBUTTON,lParam);
    pWnd->PostMessage(lb_event[i].msgup,0,lParam);
    }
    if(lb_event[i].msgdown==WM_LBUTTONDBLCLK)
    {
    pWnd->PostMessage(WM_LBUTTONDOWN,MK_LBUTTON,lParam);
    pWnd->PostMessage(lb_event[i].msgup,0,lParam);
    pWnd->PostMessage(WM_LBUTTONDOWN,MK_LBUTTON,lParam);
    pWnd->PostMessage(lb_event[i].msgup,0,lParam);
    }
      

  9.   

    WM_KEYDOWN
    This message is posted to the window with the keyboard focus when a nonsystem key is pressed. A nonsystem key is a key that is pressed when the ALT key is not pressed. WM_KEYDOWN nVirtKey = (int) wParam; lKeyData = lParam;
    Parameters
    nVirtKey 
    Specifies the virtual-key code of the nonsystem key. 
    lKeyData 
    Specifies the repeat count, context code, previous key-state flag, and transition-state flag, as shown in the following table. 
    Value Description 
    0–15 Specifies the repeat count. The value is the number of times the keystroke is repeated as a result of the user holding down the key.  
    29 Specifies the context code. The value is 1 if the ALT key is held down while the key is pressed; otherwise, the value is 0. 
    30 Specifies the previous key state. The value is 1 if the key is down before the message is sent, or it is 0 if the key is up. 
    31 Specifies the transition state. The value is 1 if the key is being released, or it is 0 if the key is being pressed. 
    SendMessage(hWnd,WM_KEYDOWN,VK_Q,0x2000);   //看MSDN,29位为1就OK了
      

  10.   

    SendMessage(hWnd,WM_KEYDOWN,VK_Q,0x02000000);   //看MSDN,29位为1就OK了
      

  11.   

    不行的。MSDN上:
    29
    Specifies the context code. The value is always 0 for a WM_KEYDOWN message.WM_SYSKEYDOWN也不行,他的问题是跨进程发给非活动窗口
      

  12.   

    奇怪  请问高手 你自己试过吗?
       编个程序   一运行点 OK 然后就能在后台打开的的TXT文件中实现ALT+E功能
      我用 ::SendMessage(bhWnd, WM_CHAR, 'e', 0);能实现 在TXT文件中添加 e 的功能
    可是无法实现 ALT+E打开菜单的功能  请注意是打开后台的打开的TXT文件
      

  13.   

    就是奇怪  能够发送::SendMessage(bhWnd, WM_CHAR, 'e', 0);过去
      为什么不能发送组合键呢?
      

  14.   

    可以了,直接发送WM_SYSCHAR消息,用spy++记录的,发两次WM_SYSKEYDOWN都不行,非用WM_SYSCHAR不可 -_-||::SendMessage(bhWnd, WM_SYSCHAR, 'e', 0x20120001);
      

  15.   

    就是发给后台的啊
    你要对文本编辑器的EDIT控件发,不是主窗口哦
      

  16.   

    我以前写过类似的,办法是给主窗口的所有子窗口发wm_syschar,不是wm_keydown,接收alt系列的好象不是主窗口,你给主窗口发不行,我是给所有子窗口发,每发一次弹个messagebox显示windowstext和classname,看是哪个窗口管alt+x,记下来,不过有的时候alt+x这类用wm_syschar也不行,我上次写foobar自动转换wav的程序就没找到应该给哪个窗口发alt+s,后来给那个主窗口发wm_command消息好使了,你不妨也试试,给主窗口发 SendMessage(hwnd, WM_COMMAND, (1<<16) | i, 0); 其中i是从0到65535的数,一般应该是10以内的,你从0开始试,看行不行
      

  17.   

    能不能发个测试包呀  [email protected] 谢谢了哈
        还有SendMessage(hwnd, WM_COMMAND, (1<<16) | i, 0);  这个什么意思呀  
     能不能简明点呀
      

  18.   

    还有   对于那些DIRECT X做的游戏
      比如  梦幻西游
     我用SPY看了  只有主窗体的
        给主窗体发 ::SendMessage(bhWnd, WM_SYSCHAR, 'e', 0x20120001);  没有用呀
    这个怎么实现呀
     开新贴继续散分