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

あなたは に渡っotherWindowていGetWindowThreadProcessIdます。しかしotherWindow、その時点ではまだ初期化されていません。私はあなたが合格するつもりだったと思いますhWnd

GetWindowThreadProcessId渡したウィンドウが存在しないため、への呼び出しはスレッド ID 0 を返すと思います。そして、それが の失敗につながりGetGUIThreadInfoます。

もう 1 つの明らかな失敗ベクトルは、currentWindowGuiThreadInfo.cbSize正しく設定できないことです。あなたはそれをやっていると言っていますが、コードを見せていないので、あなたの言葉を信じるしかありません。

余談ですが、Windows API 関数の呼び出しでエラーをチェックしていないことに注意してください。そのコードで 8 つの API 呼び出しを数えましたが、そのうちの 1 つにエラー チェックがありません。エラーをチェックする習慣を身につける必要があります。

于 2012-12-31T10:04:06.037 に答える