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

关于SendMessage(WM_RBUTTONDOWN...)和mouse_event(MOUSEEVENTF_RIGHTDOWN...)的疑问,求大神!!!
如题,我写了个小程序,程序会启动一个线程,然后在指定的其他窗口上触发鼠标以及键盘信息。
例如我在记事本上触发鼠标和键盘信息,按道理当我触发了一个右键按下+右键抬起之后,应该弹出记事本的右键菜单。
而实际上我使用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);

------解决方案--------------------
mouse_event不是发消息而是模拟硬件事件
调用右键菜单不是两个鼠标消息搞定的
------解决方案--------------------
引用:
如题,我写了个小程序,程序会启动一个线程,然后在指定的其他窗口上触发鼠标以及键盘信息。
例如我在记事本上触发鼠标和键盘信息,按道理当我触发了一个右键按下+右键抬起之后,应该弹出记事本的右键菜单。
而实际上我使用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);


引用:

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到的窗口句柄