2

ウィンドウが点滅/点滅しているときにウィンドウにフォーカスしたい。より一般的なケースは、誰かがチャット ソフトウェア (MSN など) でテキストを送信する場合です。この場合、Windows バーはスタート バーで点滅を開始します。自分で説明しているかどうかはわかりません。点滅しているウィンドウの HWND を取得したい。それを理解するためにさらに情報が必要な場合は、よりよく説明しようとします。

このケースに関する情報をすでに検索しましたが、何も見つかりませんでした。おそらく「win32gui」ライブラリを使用したリゾルバである可能性があります。

ご協力ありがとうございました!!!

4

1 に答える 1

1

まず、ほとんどのプログラムは、呼び出し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)

これらのいずれかに対して昇格した特権が必要かどうかはわかりませんが、必要だと思います。

于 2013-02-02T03:25:23.313 に答える