mouse_event无效的问题,版主们帮忙看看啊

moon5284 2013-02-18 12:24:57
有一个贱贱的程序,我现在要调用它:

hMain = ::FindWindow(NULL,L"有信");
::SetWindowPos(hMain, HWND_TOPMOST, 0, 0, 0, 0,SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED);
//使窗口置顶并获取焦点 测试上一句对它无效 下面这一段才激活窗口
typedef void (WINAPI *PSWITCHTOTHISWINDOW) (HWND,BOOL);
PSWITCHTOTHISWINDOW SwitchToThisWindow;
HMODULE hUser32=GetModuleHandle(_T("user32"));
SwitchToThisWindow=(PSWITCHTOTHISWINDOW)GetProcAddress(hUser32,"SwitchToThisWindow");
SwitchToThisWindow(hMain,TRUE);

CRect rc;
CWnd* pParent = CWnd::FromHandle(hMain);
pParent->GetWindowRect(&rc);
//设置按钮位置并点击 但程序并无反应 keybd_event发送到编辑框也无反应
SetCursorPos(rc.left + 430, rc.top + 135);// 505 235
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);


另PostMessage神马的都弱爆了,根本对它不起作用,请问对这个蠢货还有其它绝招或思路么?
...全文
2601 29 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
觅食的猫猫 2014-07-17
  • 打赏
  • 举报
回复
引用 28 楼 u011064329 的回复:
顺便吹个水, 本人是微薄“勇者大陆_神龟护谭”,AI形成论的作者,望各位齐来交流人工智能的心得!
我试了下你的程序,可以实现鼠标移动,但是没法实现点击啊 我也遇到这类问题了哎.
u011064329 2013-06-14
  • 打赏
  • 举报
回复
顺便吹个水, 本人是微薄“勇者大陆_神龟护谭”,AI形成论的作者,望各位齐来交流人工智能的心得!
u011064329 2013-06-14
  • 打赏
  • 举报
回复
经本人的烂机试过! 鼠标的处理是有延时的, Sleep(200) SetCursorPos Sleep(200) mouse_event(MOUSEEVENTF_LEFTDOWN Sleep(200) mouse_event(MOUSEEVENTF_LEFTUP 这样才都有反应! 机子更烂的就延更长!!!
moon5284 2013-02-19
  • 打赏
  • 举报
回复
我准备尝试驱动级鼠标键盘模拟,等我回来发帖分享吧 .
moon5284 2013-02-19
  • 打赏
  • 举报
回复
引用 16 楼 VisualEleven 的回复:
引用 15 楼 moon5284 的回复:引用 13 楼 VisualEleven 的回复: C/C++ code?123456789101112131415161718192021222324252627HWND hWnd = ::FindWindow(NULL, _T("BBB")); if(NULL == hWnd) { return ;……
这样对于记事本等普通程序都有效,但对它无效 .
这不是鸭头 2013-02-18
  • 打赏
  • 举报
回复
确定坐标没有问题?
hdg3707 2013-02-18
  • 打赏
  • 举报
回复
看看有没有这个函数:::mouse_event,就上前面加::,这表明是API的函数,不是MFC封装过的,如果有这个函数,这个函数的第一个参数应该就是窗口句柄,也就是把消息发送到这个句柄指定的窗口
Thinco 2013-02-18
  • 打赏
  • 举报
回复
引用 23 楼 moon5284 的回复:
呵呵 这个原因应该可以忽略 换了别的程序点击就有效了


我做了一下测试,通过TestUI对话框的确定按钮去点击TestDlg的关闭按钮,如果是

不加延时没有问题。
但如果是

那不加延时就有问题了。
moon5284 2013-02-18
  • 打赏
  • 举报
回复
引用 22 楼 Thinco 的回复:
我觉得是窗口置顶有一定的延时,需要保证鼠标点击事件在窗口置顶之后触发才行。 ShowWindow SetCursorPos Sleep(200) mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
呵呵 这个原因应该可以忽略 换了别的程序点击就有效了
Thinco 2013-02-18
  • 打赏
  • 举报
回复
我觉得是窗口置顶有一定的延时,需要保证鼠标点击事件在窗口置顶之后触发才行。 ShowWindow SetCursorPos Sleep(200) mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
moon5284 2013-02-18
  • 打赏
  • 举报
回复
引用 20 楼 VisualEleven 的回复:
引用 17 楼 moon5284 的回复:引用 8 楼 sha_jinhao 的回复: typedef struct tagMOUSEINPUT { LONG dx; LONG dy; DWORD mouseData; DWORD dwFlags; DWORD time; ULONG_PTR……
上面的代码第一步移动 第二步LButtonDown 第三步LButtonUp 运行的时候鼠标移动在按钮上 位置是对的
Eleven 2013-02-18
  • 打赏
  • 举报
回复
引用 17 楼 moon5284 的回复:
引用 8 楼 sha_jinhao 的回复: typedef struct tagMOUSEINPUT { LONG dx; LONG dy; DWORD mouseData; DWORD dwFlags; DWORD time; ULONG_PTR dwExtraInfo; } MOUSEINPUT, *PMOU……
你需要先确保你的坐标没有错误
moon5284 2013-02-18
  • 打赏
  • 举报
回复
引用 18 楼 arpnet99 的回复:
这个不是mouse_event的问题,所以改成SendInput也没有用的。
版主大哥讲的对啊,难道非要模拟驱动级的么
这不是鸭头 2013-02-18
  • 打赏
  • 举报
回复
这个不是mouse_event的问题,所以改成SendInput也没有用的。
moon5284 2013-02-18
  • 打赏
  • 举报
回复
引用 8 楼 sha_jinhao 的回复:
typedef struct tagMOUSEINPUT { LONG dx; LONG dy; DWORD mouseData; DWORD dwFlags; DWORD time; ULONG_PTR dwExtraInfo; } MOUSEINPUT, *PMOUSEIN typ……
改用了SendInput还是不行:
lpPoint.x = 160 + rc.left;
	lpPoint.y = rc.top + 350;
//	SetCursorPos(lpPoint.x, lpPoint.y);


	int dx = (160 + rc.left)*65535/width;
	int dy = (rc.top + 350)*65535/height;

	int   SuccessAction1,SuccessAction2,SuccessAction3; 
	INPUT   MyMouseInput[3];   
	MyMouseInput[0].type   =   INPUT_MOUSE;   
	MyMouseInput[0].mi.dx   = dx;
	MyMouseInput[0].mi.dy   =   dy;
	MyMouseInput[0].mi.dwFlags   =   MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE;
	MyMouseInput[0].mi.mouseData   =   NULL;   
	MyMouseInput[0].mi.dwExtraInfo   =   NULL;   
	MyMouseInput[0].mi.time   =   NULL;   
	Sleep(200);

	//typedef void (WINAPI *PSWITCHTOTHISWINDOW) (HWND,BOOL);
	//PSWITCHTOTHISWINDOW SwitchToThisWindow;
	//HMODULE hUser32=GetModuleHandle(_T("user32"));
	//SwitchToThisWindow=(PSWITCHTOTHISWINDOW)GetProcAddress(hUser32,"SwitchToThisWindow");
	//SwitchToThisWindow(hMain,TRUE);

	SuccessAction1   =   SendInput(3,MyMouseInput,sizeof(INPUT)); 
	MyMouseInput[1].type   =   INPUT_MOUSE;   
	MyMouseInput[1].mi.dx   =   dx;   
	MyMouseInput[1].mi.dy   =   dy;   
	MyMouseInput[1].mi.dwFlags   =   MOUSEEVENTF_LEFTDOWN;   
	MyMouseInput[1].mi.mouseData   =   NULL;   
	MyMouseInput[1].mi.dwExtraInfo   =   NULL;   
	MyMouseInput[1].mi.time   =   NULL;   
	Sleep(200);
	SuccessAction2   =   SendInput(3,MyMouseInput,sizeof(INPUT));
	MyMouseInput[1].type   =   INPUT_MOUSE;   
	MyMouseInput[1].mi.dx   =   dx;   
	MyMouseInput[1].mi.dy   =   dy;   
	MyMouseInput[1].mi.dwFlags   =   MOUSEEVENTF_LEFTUP;   
	MyMouseInput[1].mi.mouseData   =   NULL;   
	MyMouseInput[1].mi.dwExtraInfo   =   NULL;   
	MyMouseInput[1].mi.time   =   NULL;   
	Sleep(200);
	SuccessAction3   =   SendInput(3,MyMouseInput,sizeof(INPUT));
Eleven 2013-02-18
  • 打赏
  • 举报
回复
引用 15 楼 moon5284 的回复:
引用 13 楼 VisualEleven 的回复: C/C++ code?123456789101112131415161718192021222324252627HWND hWnd = ::FindWindow(NULL, _T("BBB")); if(NULL == hWnd) { return ; } if(::IsIconic(hWnd)) {……
不会吧,这三句还不是能置顶吗? if(::IsIconic(hWnd)) { ::ShowWindow(hWnd, SW_RESTORE); } ::BringWindowToTop(hWnd); ::SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
moon5284 2013-02-18
  • 打赏
  • 举报
回复
引用 13 楼 VisualEleven 的回复:
C/C++ code?123456789101112131415161718192021222324252627HWND hWnd = ::FindWindow(NULL, _T("BBB")); if(NULL == hWnd) { return ; } if(::IsIconic(hWnd)) { ::Show……
哥你的置顶对它不起作用,我这样可以的
typedef void (WINAPI *PSWITCHTOTHISWINDOW) (HWND,BOOL);
	PSWITCHTOTHISWINDOW SwitchToThisWindow;
	HMODULE hUser32=GetModuleHandle(_T("user32"));
	SwitchToThisWindow=(PSWITCHTOTHISWINDOW)GetProcAddress(hUser32,"SwitchToThisWindow");
	SwitchToThisWindow(hMain,TRUE);
moon5284 2013-02-18
  • 打赏
  • 举报
回复
引用 12 楼 tiger9991 的回复:
你是不是焦点没设置在那个程序上面才导致失效的?
版主大人你怀疑的有点可能,现在情况是这样:窗口不置顶鼠标位置对/单击无效果;窗口置顶鼠标位置不移动
int dx = (160 + rc.left)*65535/width;
	int dy = (rc.top + 350)*65535/height;

	int   SuccessAction1,SuccessAction2,SuccessAction3; 
	INPUT   MyMouseInput[3];   
	MyMouseInput[0].type   =   INPUT_MOUSE;   
	MyMouseInput[0].mi.dx   = dx;
	MyMouseInput[0].mi.dy   =   dy;
	MyMouseInput[0].mi.dwFlags   =   MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE;
	MyMouseInput[0].mi.mouseData   =   NULL;   
	MyMouseInput[0].mi.dwExtraInfo   =   NULL;   
	MyMouseInput[0].mi.time   =   NULL;   
	Sleep(200);
        
        //这里激活窗口的话 鼠标位置就不动了 不激活的话 位置对的 单击没效果
	typedef void (WINAPI *PSWITCHTOTHISWINDOW) (HWND,BOOL);
	PSWITCHTOTHISWINDOW SwitchToThisWindow;
	HMODULE hUser32=GetModuleHandle(_T("user32"));
	SwitchToThisWindow=(PSWITCHTOTHISWINDOW)GetProcAddress(hUser32,"SwitchToThisWindow");
	SwitchToThisWindow(hMain,TRUE);

	SuccessAction1   =   SendInput(3,MyMouseInput,sizeof(INPUT)); 
	MyMouseInput[1].type   =   INPUT_MOUSE;   
	MyMouseInput[1].mi.dx   =   dx;   
	MyMouseInput[1].mi.dy   =   dy;   
	MyMouseInput[1].mi.dwFlags   =   MOUSEEVENTF_LEFTDOWN;   
	MyMouseInput[1].mi.mouseData   =   NULL;   
	MyMouseInput[1].mi.dwExtraInfo   =   NULL;   
	MyMouseInput[1].mi.time   =   NULL;   
	Sleep(200);
	SuccessAction2   =   SendInput(3,MyMouseInput,sizeof(INPUT));
	MyMouseInput[1].type   =   INPUT_MOUSE;   
	MyMouseInput[1].mi.dx   =   dx;   
	MyMouseInput[1].mi.dy   =   dy;   
	MyMouseInput[1].mi.dwFlags   =   MOUSEEVENTF_LEFTUP;   
	MyMouseInput[1].mi.mouseData   =   NULL;   
	MyMouseInput[1].mi.dwExtraInfo   =   NULL;   
	MyMouseInput[1].mi.time   =   NULL;   
	Sleep(200);
	SuccessAction3   =   SendInput(3,MyMouseInput,sizeof(INPUT));
Eleven 2013-02-18
  • 打赏
  • 举报
回复
HWND hWnd = ::FindWindow(NULL, _T("BBB"));
	if(NULL == hWnd)
	{
		return ;
	}
	if(::IsIconic(hWnd))
	{
		::ShowWindow(hWnd, SW_RESTORE);
	}
	::BringWindowToTop(hWnd);
	::SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
	HWND hButton = ::FindWindowEx(hWnd, NULL, _T("Button"), _T("Cancel"));
	if(NULL == hButton)
	{
		return ;
	}
	RECT rc = {0};
	::GetWindowRect(hButton, &rc);
	POINT ptOrg;
	GetCursorPos(&ptOrg);
	POINT pt;
	pt.x = rc.left + (rc.right - rc.left) / 2;
	pt.y = rc.top + (rc.bottom - rc.top) / 2;
	SetCursorPos(pt.x, pt.y);
	mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
	mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
	SetCursorPos(ptOrg.x, ptOrg.y);
看不见的裂痕 2013-02-18
  • 打赏
  • 举报
回复
你是不是焦点没设置在那个程序上面才导致失效的?
加载更多回复(9)

16,547

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧