我想做的程序是,1.给指定的程序发送键盘消息和鼠标左键点击消息, 2.给windows桌面上任意激活的程序发送键盘消息和鼠标左键点击消息,这个用一个checkbox控件让用户选择。
而且一定不能用keybd_event和mouse_event!!!!我现在遇到的问题时用sendmessage和PostMessage没有反应,不是道是不是我获取句柄的问题还是别的地方不对,还有一个就是我刚开始在用mouse_event测试时(我先定位好了坐标,是桌面整屏幕定位的,用时钟事件定时模拟鼠标点击),我先模拟鼠标在windows桌面上点击一下,然后再向指定的程序界面模拟点击按钮(指定程序界面有个按钮,我实在整个桌面屏幕定位时把坐标定位在了制定程序的那个按钮上了),但无效,鼠标还是点击在前面我模拟点击桌面的那个位置,然后我手动点击了下我的程序界面后才能模拟鼠标点击到指定的程序界面,但却不是点击在按钮上,是点击在按钮旁边的位置。请大虾们帮帮忙,小弟很着急。因csdn系统不允许发表超过100分的帖子k,分不够,我会开贴再加。

解决方案 »

  1.   

    先一个一个来吧,这是我给指定程序发送空格消息的测试代码
    void CAsasasasaDlg::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
    //获得当前进程的快照
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if ((HANDLE)-1 == hSnapshot)
    {
    return;
    }
    //进程信息
    PROCESSENTRY32 ProcessInfo;
    ProcessInfo.dwSize = sizeof(PROCESSENTRY32);
    //获得快照中第一个进程
    BOOL bResult = Process32First(hSnapshot, &ProcessInfo);
    if (!bResult)
    {
    return;
    }

    while (bResult)
    {
    //进程的可执行文件名
    if(CString(ProcessInfo.szExeFile)=="kugou7.exe")
    {
    //MessageBox("程序正在运行!");
    //利用进程的ID值,打开该进程,获得进程句柄
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE,ProcessInfo.th32ProcessID);
    if(hProcess)
    {
    HWND param_hwnd=GetHwndByProcessId(ProcessInfo.th32ProcessID);
    //::SetForegroundWindow(param_hwnd);
    //添加发送代码
    ::PostMessage(param_hwnd,WM_KEYDOWN,VK_SPACE,32);//这是按下VK_SPACE的消息
    ::PostMessage(param_hwnd,WM_KEYUP,VK_SPACE,32);//这是抬起VK_SPACE的消息,注意,此处一定要有抬起的操作
    break;
    }
    }
    else
    {
    //获得快照中下一个进程
    bResult = Process32Next(hSnapshot, &ProcessInfo);
    }
    }
    if (!bResult)
    {
    MessageBox("程序没有运行!");
    }
    //关闭快照
    CloseHandle(hSnapshot);
    CDialog::OnTimer(nIDEvent);
    }HWND CAsasasasaDlg::GetHwndByProcessId(DWORD dwProcessId)
    {
        WNDINFO info = {0};
        info.hWnd = NULL;
        info.dwProcessId = dwProcessId;
        EnumWindows(Dlg_EnumProc, (LPARAM)&info);
    return info.hWnd;
    }
    BOOL CALLBACK CAsasasasaDlg::Dlg_EnumProc(HWND hWnd, LPARAM lParam)
    {
        WNDINFO* pInfo = (WNDINFO*)lParam;
        DWORD dwProcessId = 0;
        GetWindowThreadProcessId(hWnd, &dwProcessId);

        if(dwProcessId == pInfo->dwProcessId)
        {
            pInfo->hWnd = hWnd;
            return FALSE;
        }
        return TRUE;
    }
      

  2.   

    //添加发送代码
    ::PostMessage(param_hwnd,WM_KEYDOWN,VK_SPACE,32);//这是按下VK_SPACE的消息
    ::PostMessage(param_hwnd,WM_KEYUP,VK_SPACE,32);//这是抬起VK_SPACE的消息,注意,此处一定要有抬起的操作改为
     DWORD dwVKFkeyData;
     WORD dwScanCode =MapVirtualKey(VK_SPACE,0);//VK_SPACE dwVKFkeyData = 1;
     dwVKFkeyData |= dwScanCode<<16;
     dwVKFkeyData |= 0<<24;
     dwVKFkeyData |= 1<<29;
     //按下
     ::PostMessage(param_hwnd,WM_KEYDOWN,VK_SPACE,dwVKFkeyData); //弹起
     dwVKFkeyData |= 3 << 30;
     ::PostMessage(param_hwnd,WM_KEYUP,VK_SPACE,dwVKFkeyData);
      

  3.   

    先用spy++看看往哪个目标发送了什么东西,再在PostMessage中填入相应的参数就可以了
      

  4.   

    我的需求很简单,就是给指定的程序或者当前激活的程序发送快捷方式的键盘按键消息,和鼠标消息,我的程序里面是先接收触摸屏发出的数据,然后我根据需要给指定的程序发送快捷方式比如空格或者alt+f4或者其他。其实也就是通过触摸屏简单控制程序,我的程序只是起到中介作用,我是做应用软件的,不是黑客,客户有需求上头就安排我做。我们主要生产硬件,软件辅助。
      

  5.   

    针对目标程序你可以用spy++看看你关心的操作都触发了那些消息
    然后再用PostMessage发过去
    你说的一些消息可能单纯的通过键盘消息的方式还不能解决问题
    有些是系统消息
    有些是加速键消息
      

  6.   

    我用spy++看到指定的程序有好几个句柄,我怎么去判定是发给那个窗口句柄呢,比如酷狗或者迅雷看看播放器,他们又有好几个窗口句柄,帮帮忙,快过年了,小弟不想挨骂啊。
      

  7.   

    像迅雷看看播放器和酷狗音乐播放器他就不知一个窗口,虽然他看起来只有一个页面,这是我用spy++看到的,不知道是不是,这块好难判断,又过了一天了,唉,给位知道的大侠们,给小弟支支招吧。
      

  8.   

    我看了一下迅雷看看
    主窗口就是一个啊
    主窗口是XLUEFrameHostWnd
    下面有两个子窗口
    当然看看应该是directui的
    所以子窗口应该比较少
    这对你的需求应该是好事啊
    这样你需要分析的目标窗口就少了
    你做这个需求本身就很麻烦
    没什么捷径可寻
    祝你好运吧
      

  9.   

    用 Spy 看看你的目标程序是怎样响应按键的。
    是什么窗口响应按键的。然后,尝试获取这个窗口,发送按键。
    注意 WM_KEYXX 的参数。