まず、ほとんどのプログラムは、呼び出しFlashWindowEx
(またはそれをラップする高レベル関数) によってウィンドウをフラッシュします。しかし、いくつかのアプリ (主に Microsoft 製) があり、エンド ユーザーにはウィンドウの点滅のように見えますが、裏では同じように見えない場合があります。うまくいけば、そのようなカスタム アプリは気にしないでください。
とにかく、その情報を取得する最も簡単な方法は、SetWindowsHookEx
またはでシェル フックをインストールすることRegisterShellHookWindow
です。(代わりに、user32.dll の前に明示的にコードを挿入することもできますが、Python からそれを試みたくはありません。) これを行うと、Windows はウィンドウをエクスプローラ (「シェル」) の一部であるかのように扱います。他のプログラムが何をしているかについての特別なメッセージを送信しますWM_SHELLHOOKMESSAGE
。
forivall が指摘したように、これはAutoHotkeyから行う方が簡単かもしれません—<a href="http://www.autohotkey.com/board/topic/36510-detect-flashingblinking-window-on-taskbar/?p=229583" rel="nofollow noreferrer">フォーラムのこの回答は、その方法を示しています。VB や C++ から実行する方が簡単な場合もあります。はい、これらの言語は一般的に Python よりも難しくなりますが、コード内の実際のロジックは非常に簡単であり、唯一の難しい部分はシェル フック メッセージを取得することであり、その部分はそれらの言語の方が簡単です。もう 1 つの方法は、IronPython を使用して .NET 経由で実行することです。
しかし、あなたはそれが Python から可能かどうか尋ねました。そして… はい、可能です。関連する関数は でラップされていないと思うので、Python から実行するにwin32gui
は を使用する必要があります。考えられる例については、ctypes
このSO の質問を参照してください。関連する質問の一部と、user.dll からさまざまな関数を呼び出すためctypes
に使用する他の例についてはドキュメントを参照してください。ctypes
Windows フックを設定する場合、キー関数は次のようになります (詳細については、を参照ShellProc
してください)。
HSHELL_REDRAW=6
WM_SHELL=10
def my_callback(nCode, wParam, lParam):
if nCode == HSHELL_REDRAW and lParam:
got_flashing_window_with_hwnd(wParam)
hook = user32.SetWindowsHookEx(WM_SHELL, my_callback, None, 0)
ただし、タイプを設定し、コールバックを にプッシュする必要がありますctypes
。
Python から管理しているウィンドウが既にある場合は、代わりにシェル フック ウィンドウとして設定する方がおそらく簡単です。
user32.RegisterShellHookWindow(my_hwnd)
次に、ウィンドウ プロシージャで次のようにします。
WM_SHELLHOOKMESSAGE = None
def wndproc(hWnd, uMsg, lParam, wParam):
if WM_SHELLHOOKMESSAGE is None:
WM_SHELLHOOKMESSAGE = user32.RegisterWindowMessage('SHELLHOOK')
if uMsg == WM_SHELLHOOKMESSAGE and wParam == HSHELL_FLASH:
got_flashing_window_with_hwnd(lParam)
これらのいずれかに対して昇格した特権が必要かどうかはわかりませんが、必要だと思います。