1

我正在尝试通过单击另一个窗口将鼠标输入发送到一个窗口。根据使用 PostMessage 模拟按键仅适用于某些应用程序?,我正在尝试找到将事件发送到的正确句柄。这是我到目前为止所拥有的:

case WM_LBUTTONDOWN:
  GetCursorPos( reinterpret_cast<POINT *>( &mousePosition ) );  
  hWnd = WindowFromPoint(mousePosition);
  threadID = GetWindowThreadProcessId(otherWindow, &procID);

  GetGUIThreadInfo(threadID, &currentWindowGuiThreadInfo);

  otherWindow = currentWindowGuiThreadInfo.hwndFocus;

  ScreenToClient(hWnd, &mousePosition);
  ClientToScreen(otherWindow, &mousePosition);
  ScreenToClient(otherWindow, &mousePosition);
  dw = MAKELPARAM(mousePosition.x, mousePosition.y);
  PostMessage(otherWindow, WM_LBUTTONDOWN, MK_LBUTTON, dw);             

  break;

在找到这个线程之前,我正在向 WindowFromPoint 返回的句柄发送一个 PostMessage 并使用 Spy++ 我可以看到消息通过(但这种方法仅适用于某些窗口)。但是现在GetGuiThreadInfo返回错误码87(参数不正确)。我将 currentWindowGuiThreadInfo.cbSize 设置为 sizeof(GUITHREADINFO)。我哪里错了?请帮助。我在 Windows 7 64 位和 Visual Studio 2010 上使用 Visual C++、win32。

非常感谢!

编辑

我很抱歉没有清楚地回答。这是代码的更完整版本:

POINT mousePosition;
DWORD dw, procID, threadID;
HWND hWnd;
GUITHREADINFO currentWindowGuiThreadInfo;
currentWindowGuiThreadInfo.cbSize = sizeof(GUITHREADINFO);
INPUT Input={0};
HWND hw;
int e;
int xPos, yPos;
MSLLHOOKSTRUCT *mouseParameters = (MSLLHOOKSTRUCT*)lParam;
int a = 2;
if (nCode == HC_ACTION) {
    switch(wParam) {

        case WM_LBUTTONDOWN:

          GetCursorPos( reinterpret_cast<POINT *>( &mousePosition ) );
          hWnd = WindowFromPoint(mousePosition);

          threadID = GetWindowThreadProcessId(otherWindow, &procID); //otherWindow exists and I can see the proper threadID


          GetGUIThreadInfo(threadID, &currentWindowGuiThreadInfo); //currentWindowGuiThreadInfo returns null for all the handles. The cbSize is 48. But no error is returned. The return value is 1

          otherWindow= currentWindowGuiThreadInfo.hwndFocus;
          ScreenToClient(hWnd, &mousePosition);
          ClientToScreen(otherWindow, &mousePosition);
          ScreenToClient(otherWindow, &mousePosition);
          dw = MAKELPARAM(mousePosition.x, mousePosition.y);

          PostMessage(otherWindow, WM_LBUTTONDOWN, MK_LBUTTON, dw);
          break;
4

1 回答 1

1

你正在传递otherWindowGetWindowThreadProcessId. 但otherWindow此时尚未初始化。我猜你是想通过hWnd

我猜调用GetWindowThreadProcessId返回的线程 ID 为 0,因为您传递的窗口不存在。这导致GetGUIThreadInfo.

另一个明显的失败向量是你没有currentWindowGuiThreadInfo.cbSize正确设置。你说你正在这样做,但由于你没有显示代码,我们只能相信你的话。

顺便说一句,我注意到您没有在对 Windows API 函数的任何调用中检查错误。我计算了该代码中的 8 个 API 调用,其中没有一个具有错误检查功能。你真的必须养成检查错误的习惯。

于 2012-12-31T10:04:06.037 回答