如果是一个别人的任意软件,它在后台运行,如何给它模拟发送键盘消息?

解决方案 »

  1.   

    先调用EnumWindows
    然后GetWindowProcessID
    如果窗口是你想要的进程则SendMessage即可
      

  2.   

    我可以通过    CWnd* pWnd=CWnd::FindWindow(NULL,"窗口标题名");  找到程序对应的窗口
    但用
    if (pWnd!=NULL)
    {
    HWND hWnd=pWnd->GetSafeHwnd();
    ::PostMessage(hWnd,WM_CHAR,0x41,0);
    }发送消息并不能被接受。
      

  3.   

    通过    CWnd* pWnd=CWnd::FindWindow(NULL,"窗口标题名");  找到程序对应的窗口 if (pWnd!=NULL)
    {
    INPUT in;
    in.type=INPUT_KEYBOARD;
    in.ki.wScan=0x1e;
    HWND hWnd=pWnd->GetSafeHwnd();
    ::SetFocus(hWnd);
    SendInput(1,&in,sizeof(INPUT));
    }
    出现编译错误:INPUT 没有声明。但我已经有了:#include "winuser.h"被编译错误就拦住了,更不知道这个方法是否可行。请高手给出点调试过的原代码,谢谢。
      

  4.   

    估计是你的WINVER定义不够高,安装平台SDK,并且在工程里面定义WINVER=0x0500
      

  5.   

    in winuser.h  
    #if (_WIN32_WINNT > 0x0400)  // line 4281
       .......
    typedef struct tagKEYBDINPUT {
        WORD    wVk;
        WORD    wScan;
        DWORD   dwFlags;
        DWORD   time;
        DWORD   dwExtraInfo;
    } KEYBDINPUT, *PKEYBDINPUT, FAR* LPKEYBDINPUT;
        ........
    typedef struct tagINPUT {
        DWORD   type;    union
        {
            MOUSEINPUT      mi;
            KEYBDINPUT      ki;
            HARDWAREINPUT   hi;
        };
    } INPUT, *PINPUT, FAR* LPINPUT;WINUSERAPI
    UINT
    WINAPI
    SendInput(
        UINT    cInputs,     // number of input in the array
        LPINPUT pInputs,     // array of inputs
        int     cbSize);     // sizeof(INPUT)#endif // (_WIN32_WINNT > 0x0400)
      

  6.   

    #include <winable.h>包含这个头文件
      

  7.   

    #include <winable.h>以后,编译通过,但用SendInput的下面代码没有能够实现发送键盘消息。
    CWnd* pWnd=CWnd::FindWindow(NULL,"无标题 - 记事本");
    if (pWnd!=NULL)
    {
    INPUT in;
    in.type=INPUT_KEYBOARD;
    in.ki.wScan=0x1e;
    HWND hWnd=pWnd->GetSafeHwnd();
    ::SetFocus(hWnd);
    SendInput(1,&in,sizeof(INPUT));
    ::PostMessage(hWnd,WM_CHAR,0x41,0);
    }请用过的朋友指点。
      

  8.   

    这个窗口应该是创建它的线程的当前接收输入的焦点窗口才行.先用SetForegroundWindow,再发消息试试.我没试过
      

  9.   

    使用 keybd_event, 其申明在 winuser.h:
    WINUSERAPI VOID WINAPI keybd_event(
        BYTE bVk,
        BYTE bScan,
        DWORD dwFlags,
        DWORD dwExtraInfo);例如:
    void SendKeyDown(CWnd* pWnd, CONST UINT uChar, CONST UINT uFlag)
    {
      if(IsWindow(pWnd))
      {
         SetForegroundWindow(pWnd)
      }
      ::keybd_event((BYTE)uChar, (BYTE)uChar, 0, 0);
    }void SendKeyUp(CWnd* pWnd, CONST UINT uChar, CONST UINT uFlag)
    {
      if(IsWindow(pWnd))
      {
         SetForegroundWindow(pWnd)
      }
      ::keybd_event((BYTE)uChar, (BYTE)uChar, KEYEVENTF_KEYUP, 0);
    }
      

  10.   

    使用 keybd_event API , 例如
    VOID SendKey(HWND hWnd, CONST BYTE *pKey)
    {
       if(IsWindow(hWnd))     SetForegroundWindow(hWnd);
       if(pKey)
       {
         int i=0;
         while(pKey[i])
         {
             ::keybd_event(pKey[i], pKey[i}, 0, 0);
             i++;
         }
         Sleep(500);
         i--;
         while(i>=0)
         {
             ::keybd_event(pKey[i], pKey[i}, KEYEVENTF_KEYUP, 0);
             i--;
         }
      }
    }
      

  11.   

    要 if(IsWindow(hWnd))     SetForegroundWindow(hWnd); 把窗口调到前台来,就不是所需要达到的目的了。难道真的就没有办法实现吗?不,我相信一定有高手会的!请继续讨论。
      

  12.   

    看看这个吧,AttachThreadInput
    应该可以了
      

  13.   

    有 AttachThreadInput 的例程吗?
      

  14.   

    《Advanced Windows》那本书上说得比较清楚~
      

  15.   

    几点提示和建议1
    SendMessage 和 PostMessage 是有些区别的。
    这个不行就换一个试2 
    你发送的消息也要换,看一下是不是消息接受到了,但你看不出效果。
    比较简单的就是SendMessage(hwnd, WM_COLSE, 0, 0);
      

  16.   


    参考:《用应用程序模拟键盘和鼠标按键》配套源代码 详细信息 < 其它 >  在Windows大行其道的今天,windows界面程序受到广大用户的欢迎。对这些程序的操作不外乎两种,键盘输入控制和鼠标输入控制。有时,对于繁杂的,或重复性的输入操作,我们能否通过编制程序来代替手工输入,而用程序来模拟键盘及鼠标的输入呢?答案是肯定的。这里主要是通过两个Windows API函数来实现的。本文以 VC++为例来介绍一下如何实现这两个功能,并给出示例代码。[代码性质] VC可重用代码段
    [代码作者] Owen.Guo
    [文件大小] 22K 
    [更新日期] 2002-3-8 16:26:00 
    [下载次数] 2027 
     
    http://www.vckbase.com/code/relateddoc.asp?id=521
      

  17.   

    我记得windows核心编程上好像提到,在一个时候
    只有一个窗口线程挂接到windows平台的输入线程上,
    只有那个挂接的窗口线程才能接收到消息!
    你可以参考一下那本书!