我想做的程序是,1.给指定的程序发送键盘消息和鼠标左键点击消息, 2.给windows桌面上任意激活的程序发送键盘消息和鼠标左键点击消息,这个用一个checkbox控件让用户选择。
而且一定不能用keybd_event和mouse_event!!!!我现在遇到的问题时用sendmessage和PostMessage没有反应,不是道是不是我获取句柄的问题还是别的地方不对,还有一个就是我刚开始在用mouse_event测试时(我先定位好了坐标,是桌面整屏幕定位的,用时钟事件定时模拟鼠标点击),我先模拟鼠标在windows桌面上点击一下,然后再向指定的程序界面模拟点击按钮(指定程序界面有个按钮,我实在整个桌面屏幕定位时把坐标定位在了制定程序的那个按钮上了),但无效,鼠标还是点击在前面我模拟点击桌面的那个位置,然后我手动点击了下我的程序界面后才能模拟鼠标点击到指定的程序界面,但却不是点击在按钮上,是点击在按钮旁边的位置。请大虾们帮帮忙,小弟很着急。因csdn系统不允许发表超过100分的帖子k,分不够,我会开贴再加。
而且一定不能用keybd_event和mouse_event!!!!我现在遇到的问题时用sendmessage和PostMessage没有反应,不是道是不是我获取句柄的问题还是别的地方不对,还有一个就是我刚开始在用mouse_event测试时(我先定位好了坐标,是桌面整屏幕定位的,用时钟事件定时模拟鼠标点击),我先模拟鼠标在windows桌面上点击一下,然后再向指定的程序界面模拟点击按钮(指定程序界面有个按钮,我实在整个桌面屏幕定位时把坐标定位在了制定程序的那个按钮上了),但无效,鼠标还是点击在前面我模拟点击桌面的那个位置,然后我手动点击了下我的程序界面后才能模拟鼠标点击到指定的程序界面,但却不是点击在按钮上,是点击在按钮旁边的位置。请大虾们帮帮忙,小弟很着急。因csdn系统不允许发表超过100分的帖子k,分不够,我会开贴再加。
解决方案 »
- 指针设置为NULL之后还可以用delete释放么?
- 高分求用MFC开发学生成绩管理系统 急用啊,
- 请教,有没有什么工具可以显示当前应用程序所用com名称?
- 关于虚函数onidle的使用。
- 大家帮个忙,一个关于数据库连接的问题,急,在线等待!!!!
- 想知道一个计算机上安装了几个硬盘,怎么通过编程实现
- 怎样动态创建一个CStatic控件?
- 有关存储过程?求教各位了?
- 用VS编写wince程序,printf直接跳过不执行?
- 请问我的VC6.0的platform SDK不太新,那么如果我装VC7.0是否可以解决这个问题
- PAE似乎没有什么作用啊,必须调用PAE的函数来编程,还是不能得到超大指针
- 请教进程之间如何共享字符串数据呢?
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;
}
::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);
然后再用PostMessage发过去
你说的一些消息可能单纯的通过键盘消息的方式还不能解决问题
有些是系统消息
有些是加速键消息
主窗口就是一个啊
主窗口是XLUEFrameHostWnd
下面有两个子窗口
当然看看应该是directui的
所以子窗口应该比较少
这对你的需求应该是好事啊
这样你需要分析的目标窗口就少了
你做这个需求本身就很麻烦
没什么捷径可寻
祝你好运吧
是什么窗口响应按键的。然后,尝试获取这个窗口,发送按键。
注意 WM_KEYXX 的参数。