まず、これが物議を醸す議論であることは承知していますが、これを技術的なものにしておくことができれば幸いです。
バックグラウンドで起動されるアプリケーションがあり、別のプロセスでウィンドウをアクティブ化/フォーカスできるようにしたいと考えています。ただし、アクティブ化するウィンドウのプロセスが AllowSetForegroundWindow(ASFW_ANY) を呼び出した場合でも、SetForegroundWindow の呼び出しは常に失敗します。
その理由は(IMO)、開始アプリケーションがバックグラウンドプロセスであり、入力を受け取っていないため、フォアグラウンドウィンドウを設定できないためです。したがって、すべてがタスクリストに表示されますが、表示されません。
そこで、すぐに閉じられ、その後SetForegroundWindow を正常に呼び出すことができる入力を受け取るダミー ウィンドウを作成してみました。しかし、私が表示するダミーウィンドウでさえ背景に表示されます。
しかし、私が電話すると
AttachThreadInput(
GetWindowThreadProcessId(GetForegroundWindow(), NULL),
GetCurrentThreadId(), TRUE);
ダミーウィンドウを作成する前に、ウィンドウは実際にフォアグラウンドで作成され、後で別のプロセスで別の HWND に対して SetForegroundWindow を呼び出すことができます。
BUT: ダミー ウィンドウを作成しないと、AttachThreadInput を使用しても SetForegroundWindow はゼロを返します。
独自のウィンドウを作成した場合に AttachThreadInput ハックが成功する (および後で他のウィンドウで成功する) が、最初に独自のウィンドウを作成しないと失敗する理由がわかりません。
ダミー ウィンドウを作成せずに、バックグラウンド プロセスが別のプロセスの別のウィンドウで SetForegroundWindow を呼び出すにはどうすればよいですか?
[*] バックグラウンド アプリケーションは実際には gpg-agent.exe であり、パスワードが要求されるたびに pinentry.exe (私のアプリケーション) を呼び出します。pinentry.exe (バックグラウンド プロセスとして実行) は、別の実行中のアプリケーションからパスワードを要求する必要があるため、ウィンドウを前面に表示する必要があります ...