EVENT_SYSTEM_FOREGROUND イベント (つまり、ユーザーがウィンドウを切り替えたとき) をキャプチャするためのフックをインストールしたプログラム (バックグラウンド プロセスとして実行) があります。フックに登録されているコールバックは、基本的に、ユーザーが切り替えたアプリケーション (プロセス exe ファイル名) と、切り替えたアプリケーションをログに記録します。
切り替え元のアプリケーションがまだアクティブであるかどうかを確認するコードを追加したいと思います(そうでない場合は、アプリケーションを閉じており、それが新しいウィンドウを前面に表示したと仮定します)。OpenProcessを使用して以前のPIDへのハンドルを作成しようとすることで、その存在をテストしています
//Check prev pid still exists - if not, assume the previous app has been closed
HANDLE hPrevProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,false,g_prevPid);
if (hPrevProc==NULL){
prevProcStillRunning=false;
}
else{
CloseHandle(hPrevProc);
}
上記のコードでの仮定:
g_prevPid には PID が入力されています - この
prevProcStillRunning が true に初期化されていることを確認しました
上記のコードの問題は、ユーザーがアプリ (たとえば、notepad.exe など) を終了した場合でも、何らかの理由で発生することです。それらが終了してから最大 10 秒間、このテストは引き続きパスします (つまり、hPrevProc が初期化されます)。タスク マネージャーで Notepad.exe プロセスが消えたことを確認できますが (もちろん、開いているインスタンスは 1 つしかありません)、どういうわけか、OpenProcess 行はその PID のハンドルを取得できます。どういうわけかPIDは実際にはまだ存在していると推測していますが、終了している状態になっている可能性があります。このコードがさらに数回呼び出されると、最終的に null が返されることがわかりました。
hPrevProc がまだアクティブであるかどうかをテストできるより良い方法を見つけたいと思います。GetExitCodeProcess関数を使用してこれをテストしようとしましたが、これは単に PID を提供しているように見え、いずれにせよそれが正しいアプローチであるかどうかさえわかりません。
どんな助けでも感謝します。