別のウィンドウをクリックして、マウス入力をウィンドウに送信しようとしています。PostMessageでのキー押下のシミュレートは、一部のアプリケーションでのみ機能しますか? 、イベントを送信する正しいハンドルを見つけようとしています。これが私がこれまでに持っているものです:
case WM_LBUTTONDOWN:
GetCursorPos( reinterpret_cast<POINT *>( &mousePosition ) );
hWnd = WindowFromPoint(mousePosition);
threadID = GetWindowThreadProcessId(otherWindow, &procID);
GetGUIThreadInfo(threadID, ¤tWindowGuiThreadInfo);
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, ¤tWindowGuiThreadInfo); //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;