关于SendMessage(WM_RBUTTONDOWN...)和mouse_event(MOUSEEVENTF_RIGHTDOWN...)的疑问,求大神!!!

linchang_3344 2014-07-03 10:18:11
如题,我写了个小程序,程序会启动一个线程,然后在指定的其他窗口上触发鼠标以及键盘信息。
例如我在记事本上触发鼠标和键盘信息,按道理当我触发了一个右键按下+右键抬起之后,应该弹出记事本的右键菜单。
而实际上我使用mouse_event是可以出来这个右键菜单的,而使用SendMessage的话则不会,可以发现焦点似乎不在记事本的编辑框内,不知道这是为什么??
下面是具体的代码:


CWnd::FromHandle(hWnd)->ShowWindow(SW_NORMAL);
CWnd::FromHandle(hWnd)->SetForegroundWindow();

SetCursorPos(ptPointA.x, ptPointA.y);
strLogs.Format("移动鼠标到点A!");
WriteLog(strLogs, 1);

// 鼠标右击
// 使用SendMessage的话可以看到编辑框内鼠标在闪,我想是因为上面的SetCursorPos的缘故
// 但是似乎由于SetCursorPos把焦点定到编辑框后,下面的SendMessage马上又把焦点拉出去了,这是为什么呢?
//::SendMessage(hWnd, WM_RBUTTONDOWN, NULL, NULL);
//::SendMessage(hWnd, WM_RBUTTONUP, NULL, NULL);
mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);//点下右键
mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);//松开右键
strLogs.Format("鼠标右击!");
WriteLog(strLogs, 1);

Sleep(10);

SetCursorPos(ptPointB.x, ptPointB.y);
strLogs.Format("移动鼠标到点B");
WriteLog(strLogs, 1);

Sleep(10);

// 鼠标左击
//::SendMessage(hWnd, WM_LBUTTONDOWN, NULL, NULL);
//::SendMessage(hWnd, WM_LBUTTONUP, NULL, NULL);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);//点下左键
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);//松开左键
strLogs.Format("鼠标左击");
WriteLog(strLogs, 1);

Sleep(10);

// 空格
//::SendMessage(hWnd, WM_KEYDOWN, VK_SPACE, NULL);
keybd_event(VK_SPACE, 0, 0, 0);
keybd_event(VK_SPACE, 0, KEYEVENTF_KEYUP, 0);
strLogs.Format("按下空格");
WriteLog(strLogs, 1);

Sleep(1000);
strLogs.Format("继续循环!");
WriteLog(strLogs, 1);
strLogs.Format("=======================================");
WriteLog(strLogs, 1);
...全文
591 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
QQ515311445 2014-07-03
  • 打赏
  • 举报
回复
引用 楼主 linchang_3344 的回复:
如题,我写了个小程序,程序会启动一个线程,然后在指定的其他窗口上触发鼠标以及键盘信息。 例如我在记事本上触发鼠标和键盘信息,按道理当我触发了一个右键按下+右键抬起之后,应该弹出记事本的右键菜单。 而实际上我使用mouse_event是可以出来这个右键菜单的,而使用SendMessage的话则不会,可以发现焦点似乎不在记事本的编辑框内,不知道这是为什么?? 下面是具体的代码:

		CWnd::FromHandle(hWnd)->ShowWindow(SW_NORMAL); 
		CWnd::FromHandle(hWnd)->SetForegroundWindow();

		SetCursorPos(ptPointA.x, ptPointA.y);
		strLogs.Format("移动鼠标到点A!");
		WriteLog(strLogs, 1);

		// 鼠标右击
		// 使用SendMessage的话可以看到编辑框内鼠标在闪,我想是因为上面的SetCursorPos的缘故
		// 但是似乎由于SetCursorPos把焦点定到编辑框后,下面的SendMessage马上又把焦点拉出去了,这是为什么呢?
		//::SendMessage(hWnd, WM_RBUTTONDOWN, NULL, NULL);
		//::SendMessage(hWnd, WM_RBUTTONUP, NULL, NULL);
		mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);//点下右键
		mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);//松开右键
		strLogs.Format("鼠标右击!");
		WriteLog(strLogs, 1);

		Sleep(10);

		SetCursorPos(ptPointB.x, ptPointB.y);
		strLogs.Format("移动鼠标到点B");
		WriteLog(strLogs, 1);

		Sleep(10);

		// 鼠标左击
		//::SendMessage(hWnd, WM_LBUTTONDOWN, NULL, NULL);
		//::SendMessage(hWnd, WM_LBUTTONUP, NULL, NULL);
		mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);//点下左键
		mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);//松开左键
		strLogs.Format("鼠标左击");
		WriteLog(strLogs, 1);

		Sleep(10);

		// 空格
		//::SendMessage(hWnd, WM_KEYDOWN, VK_SPACE, NULL);
		keybd_event(VK_SPACE, 0, 0, 0);
		keybd_event(VK_SPACE, 0, KEYEVENTF_KEYUP, 0); 
		strLogs.Format("按下空格");
		WriteLog(strLogs, 1);

		Sleep(1000);
		strLogs.Format("继续循环!");
		WriteLog(strLogs, 1);
		strLogs.Format("=======================================");
		WriteLog(strLogs, 1);
引用 1 楼 VisualEleven 的回复:

HWND hWnd = ::FindWindow(_T("Notepad"), NULL);
	if(NULL == hWnd)
	{
		return ;
	}
	HWND hEdit = ::FindWindowEx(hWnd, NULL, _T("Edit"), NULL);
	if(NULL != hEdit)
	{
		CRect rect;
		::GetWindowRect(hEdit, &rect);
		CPoint pt = rect.CenterPoint();
		::PostMessage(hEdit, WM_CONTEXTMENU, (WPARAM)hEdit, MAKELPARAM(pt.x, pt.y));
	}
PostMessage第一个参数要用二楼所说的方法FindWindow到的窗口句柄
向立天 2014-07-03
  • 打赏
  • 举报
回复
mouse_event不是发消息而是模拟硬件事件 调用右键菜单不是两个鼠标消息搞定的
Eleven 2014-07-03
  • 打赏
  • 举报
回复

HWND hWnd = ::FindWindow(_T("Notepad"), NULL);
	if(NULL == hWnd)
	{
		return ;
	}
	HWND hEdit = ::FindWindowEx(hWnd, NULL, _T("Edit"), NULL);
	if(NULL != hEdit)
	{
		CRect rect;
		::GetWindowRect(hEdit, &rect);
		CPoint pt = rect.CenterPoint();
		::PostMessage(hEdit, WM_CONTEXTMENU, (WPARAM)hEdit, MAKELPARAM(pt.x, pt.y));
	}

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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