既存の最大化されたウィンドウを特定し、EnumWindows と GetWindowPlacement を使用してその場所をログに記録するプログラムを作成しました。
目的の EXE の場所がわかっていると仮定すると、外部プロセスの呼び出し元を呼び出すだけで開くことができます。しかし、新しく開いたウィンドウを特定し、その場所を設定する最善の方法は何でしょうか? 同じ名前のプログラムが既に開いている可能性があると想定しても問題ありません (たとえば、cmd の 2 つのインスタンス)。
ウィンドウが識別されたら、その場所をSetWindowPosで設定できると思います。
これは正しい質問ですか?プログラムを開いて、代わりに HWND ハンドルを受け取る方法はありますか?
イベントフックの流れでは、次のコードがあります。
HWINEVENTHOOK hook = SetWinEventHook(EVENT_OBJECT_CREATE, EVENT_OBJECT_CREATE, NULL, proc, 0, 0, WINEVENT_OUTOFCONTEXT );
BOOL result = CreateProcess(NULL, szPath, &saProcess, &saThread, FALSE, 0, NULL, NULL, &si, &piProcessC);
if (hook) {
UnhookWinEvent(hook);
}
フックを作成してからプロセスを作成します(メモ帳++を開いています)。
呼び出す proc 関数は次のとおりです。
void CALLBACK proc(HWINEVENTHOOK hook, DWORD event, HWND hWnd, LONG obj, LONG child, DWORD thr, DWORD time) {
if (IsWindow(hWnd)){
WINDOWPLACEMENT *wp = new WINDOWPLACEMENT();
wp->length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(hWnd, wp);
wp->rcNormalPosition.top = (long) 363;
wp->rcNormalPosition.bottom = (long) 1021;
wp->rcNormalPosition.left = (long) 1444;
wp->rcNormalPosition.right = (long) 2551;
BOOL tmp = SetWindowPlacement(hWnd, wp);
cout << "FOUND IT\n";
}
}
proc 関数が呼び出されていないように見えるので、フックは何もキャッチしていませんか?
ああ、WINEVENT_OUTOFCONTEXT が正しいかどうかはわかりません。これは単純な EXE が呼び出しを行っているだけです。