タスクバーのアイコンが点滅したときを検出してプログラムを起動するスクリプトを作成したいとします。 AutoItまたはWindows APIを使用したいと思います。タスクバーのアイコンが点滅するのを検出する
プログラムのタスクバーアイコンが点滅を開始するタイミングを検出する方法はありますか?
タスクバーのアイコンが点滅したときを検出してプログラムを起動するスクリプトを作成したいとします。 AutoItまたはWindows APIを使用したいと思います。タスクバーのアイコンが点滅するのを検出する
プログラムのタスクバーアイコンが点滅を開始するタイミングを検出する方法はありますか?
ご質問に直接お答えください。ウィンドウの点滅を検出する簡単な(文書化された信頼できる)方法はありません。 FlashWindow/FlashWindowExの結果として発生します。非常に邪魔になる重大なオプションは、両方のAPIのグローバルフックを実行することです。すべてのusermodeアプリケーションにDLLを注入し、あなたが所有する中央実行可能ファイルを通知するローカルフック/迂回を実行することで、これを行うことができます。
しかし、あなたが提案しているものに大きな根本的な問題があり、非常に好ましくありません。フォーカスがないときに常に点滅するアプリケーションを想像してみてください。あなたのアプリはそれをフォアグラウンドに設定します。 two such applicationsがあればどうなりますか?レイモンドが示唆するようWH_SHELL
フックを使用して
はあまりにも難しいことではないとようにSetWindowsHookExを呼び出すことによって行われます:
SetWindowsHookEx(WH_SHELL, hook_proc, NULL, dwPID);
これはhook_proc
としてHOOKPROC
とdwPID
とシェルフックがどのスレッドで設定します私たちはフックを関連づけたい。どのプログラムをターゲットにするかは既に知っていると言われているので、すでにそのウィンドウにHWND
があると仮定します。あなたはそのように行うことができdwPID
を生成する必要があります。
DWORD dwID = GetWindowThreadProcessId(hwnd, NULL)
これはHWND
の関連するPIDとdwPID
を移入します。次のステップでは、DLLとは対照的に、現在の実行可能ファイルにフックプロシージャを置くことを想定しています。フックプロシージャは次のようなものかもしれません:
LRESULT CALLBACK hook_proc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode == HSHELL_REDRAW && lParam){
SetForegroundWindow(hwnd); // assumed hwnd is a global
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
上記のコードは、テストされていないとミスが含まれているかもしれませんが、あなたは何をすべきかの一般的なアイデアを与える必要があります。
ウィンドウフックに注意する重要な点の1つは、SetWindowHookEx
をターゲットと同じ易さのプログラムから呼び出さなければならないことです。ターゲットが64ビットの場合、SetWindowHookEx
の発信者も64ビットでなければなりません。また、作業が完了したら、UnhookWindowsHookExでフックを外してクリーンアップする必要があります。
私は点滅する特定のプログラムを気にするだけなので、問題は起こりません。あなたはアプリケーションにDLLを注入する方法についていくつかの光を当てることができるでしょうか?私はフックがどちらであるかはよく分かりません。 – Michael
RegisterShellHookWindow APIを使用して、HSHELL_FLASHメッセージを待ち受けます。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms644989(v=vs.85).aspx
これは意味をなさない。ユーザーがウィンドウを使用している間にプログラムがフォアグラウンドでウィンドウをプッシュしようとしたため、ボタンが点滅しています。このフォーカスを盗むのを防ぐことは、ユーザーに強く推奨されます。 Google SPI_SETFOREGROUNDLOCKTIMEOUTを無視したい場合 –
PixelSearchはあなたのタスクバー領域( '$ Taskbar = WinGetHandle(" [Class:Shell_TrayWnd] ")、' $ taskbarPos = WinGetPos($ taskbar) '、' $ tasklistPos = ControlGetPos($ taskbar PixelSearch($ taskbarPos [0] + $ tasklistPos [0]、$ taskbarPos [1] + $ tasklistPos [1]、$ taskbarPos [0])のように、[クラス:MSTaskListWClass;インスタンス:1] ] + $ tasklistPos [2]、$ taskbarPos [1] + $ tasklistPos [3]、0x00CCCC00) '0x00CCCC00はその橙色の色です...一定の出現を検索します。 – Samoth