我在各语句后添加了Sleep也不能发送成功带ALT的组合键,哪里做得不对呀?

解决方案 »

  1.   

    各位大侠,有给后台记事本发送Alt+E快捷键的好办法吗???
      

  2.   

    各位大侠,有给后台记事本发送Alt+E快捷键的好办法吗?
      

  3.   

    "WM_KEYDOWN和WM_CHAR都是键盘消息。TranslateMessage函数已经将按键消息转换成字符消息了,那么WndProc函数中需要对事件进行选择。如:键入“D”键,就应该选择WM_CHAR,因为WM_CHAR 只是字母,不包含特殊字符如Ctrl等。
    如果键盘键入的是“Ctrl+D”,则应该选择WM_KEYDOWN,因为WM_KEYDOWN既包含字母也包含特殊字符。
     WM_CHAR是由WM_KEYDOWN消息Translate()之后产生的,然后再发送给窗口过程。例如按下“D”键,产生WM_KEYDOWN消息,此消息经过Translate()处理后变成了WM_KEYDOW、WM_CHAR两个消息传递给窗口过程。
     而WM_SYSKEYDOWN是接受快捷键或系统命令按键的,像Alt键就是。所以捕获Alt键时,在WM_KEYDOWN下是无效的,要在WM_SYSKEYDOWN中。Ctrl和shift不属于WM_SYSKEYDOWN。"
      

  4.   

    to schlafenhamster:
    我发的消息是用SPY++查来的,看了你的回答,有点迷糊
    倒底给后台记事本发Alt+E应该用什么?
    我是用的WM_SYSKEYDOWN呀?
      

  5.   

    改改
    PostMessage(m_hWnd, WM_SYSCHAR, 'E', MakeKeyLparam('E', WM_SYSCHAR));
      

  6.   

    用了下面的做了试验
            PostMessage(m_hWnd, WM_SYSKEYDOWN, VK_MENU, MakeKeyLparam(VK_MENU, WM_SYSKEYDOWN));
            PostMessage(m_hWnd, WM_SYSKEYDOWN, 'E', MakeKeyLparam('E', WM_SYSKEYDOWN));
            PostMessage(m_hWnd, WM_CHAR, 'E', MakeKeyLparam('E', WM_CHAR));
            PostMessage(m_hWnd, WM_SYSKEYUP, 'E', MakeKeyLparam('E', WM_SYSKEYUP));
            PostMessage(m_hWnd, WM_KEYUP, VK_MENU, MakeKeyLparam(VK_MENU, WM_KEYUP));
    一样没效果,如果把记事本程序放在前台就能成功
      

  7.   

    亲,我就是来问有办法给后台记事本发ALT+E吗,前台的早就会了好么 话说你有看我的问题么?
      

  8.   

    另外
    MakeKeyLparam
    是 VB 的 吧 ?
      

  9.   

    MakeKeyLparam只是个函数名,哪分什么VB、VCint MakeKeyLparam(int VirtualKey, int flag)
    {
        unsigned int sCode;
        AnsiString strLp, Firstbyte, Secondbyte;
        switch (flag)
        {
          case WM_KEYDOWN:      Firstbyte = "00"; 
          break;
          case WM_KEYUP:        Firstbyte = "C0";
          break;
          case WM_CHAR:         Firstbyte = "20";
          break;
          case WM_SYSKEYDOWN:   Firstbyte = "20";
          break;
          case WM_SYSKEYUP:     Firstbyte = "E0";
          break;
          case WM_SYSCHAR:      Firstbyte = "E0";
          break;
        }
        int iKey = MapVirtualKey(VirtualKey, 0);
        Secondbyte = IntToHex(iKey, 2);
        strLp = "0x" + Firstbyte + Secondbyte + "0001";
        sCode = strLp.ToInt();
        return sCode;
    }
      

  10.   

    key 只对 Active 窗口 才  有用;用 keybd_event 的 代码 如下, 一样要 先 激活。HWND hwnd=::Findwindow(“NotePad","无标题 - 记事本");
    if( hwnd)
    {
    ::BringWindowToTop(hwnd);
    keybd_event(VK_MENU,0,0,0);
    keybd_event('F',0,0,0);
    keybd_event('F',0,KEYEVENTF_KEYUP,0);
    keybd_event(VK_MENU,0,KEYEVENTF_KEYUP,0);
    }
      

  11.   

    to schlafenhamster:就是系统不支持向后台发送这种组合键消息是吧to mlqxj35674:找到了的
      

  12.   

    看看能不能用:
    AttachThreadInput
      

  13.   

    AttachThreadInput  附加 NotePad 的input到你的程序,2个程序用一个input, 有什么反了的意思?
      

  14.   

    已经试验,AttachThreadInput挂是能挂上,但还是解决不了问题,目标程序没反应我们的程序为A,记事本为B
    AttachThreadInput(GetWindowThreadProcessId(A, NULL), GetWindowThreadProcessId(B, NULL), true)
    挂上后,给B发消息(就是原来那些),B没反应,A的Edit菜单出来了(为了试验也给A加了EDIT菜单) 其实从前面函数PostMessage的返回值和发送单键能成功看到效果上看得出来,目标程序(记事本)是能接到我们发的消息的,但不知道为什么没反应
      

  15.   

    我自己试了一下。 没效果。
    ::BringWindowToTop(hwnd); 还是 去不掉。
      

  16.   

    反着挂也试了:
    AttachThreadInput(GetWindowThreadProcessId(B, NULL), GetWindowThreadProcessId(A, NULL), true)
      

  17.   

    int MakeKeyLparam(int VirtualKey, int flag)
    {
        UINT sCode;
    //Firstbyte ; lparam 参数的 24-31位
    UINT Firstbyte;
        switch (flag)
        {
          case WM_KEYDOWN:    Firstbyte = 0;   break;
          case WM_KEYUP:      Firstbyte = 0xC0;break;
          case WM_CHAR:       Firstbyte = 0x20;break;
          case WM_SYSKEYDOWN: Firstbyte = 0x20;break;
          case WM_SYSKEYUP:   Firstbyte = 0xE0;break;
          case WM_SYSCHAR:    Firstbyte = 0xE0;break;
        }
    // 键的扫描码; lparam 参数 的 16-23位
        UINT iKey = MapVirtualKey(VirtualKey, 0);
    // 1为 lparam 参数的 0-15位,即发送次数
        sCode = (Firstbyte << 24) + (iKey << 16) + 1; 
        return sCode;
    }
      

  18.   

    int MakeKeyLparam(int VirtualKey, int flag)
    {
        UINT sCode;
    //Firstbyte ; lparam 参数的 24-31位
    UINT Firstbyte;
        switch (flag)
        {// 24 Specifies whether the key is an extended key, 
         // 25–28 Reserved; do not use 
     // 29 Specifies the context code.
     // The value is 1 if the ALT key is down while the key is pressed;
     // it is 0 if the WM_SYSKEYDOWN message is posted to the active window 
     // because no window has the keyboard focus.
      

  19.   

    我们发的第29位是1呀是不是带ALT的组合键就不能发给非活动窗口呀
      

  20.   

    只能 再试试:
    WM_SYSKEYDOWN  改 WM_KEYDOWN 
      

  21.   

    http://www.autohotkey.com
      

  22.   

    我是自己做程序,不是要找工具呀,楼上有用API解决这个问题的办法吗?
      

  23.   

    看来 ::BringWindowToTop(hwnd); 还是 去不掉。
    不过 不明白 为什么 不能 ::BringWindowToTop(hwnd); 
      

  24.   

    我是想要后台操作CAD。
    做一个程序,设置好参数及方案,自动处理图形及相关计算,但这个过程想在后台进行,不想影响前台的工作(计算机不多呀,嘿嘿)