3

オーナー ウィンドウをクリックすると、標準の Windows ダイアログが点滅します。この効果は、ウィンドウのアクティブ化と非アクティブ化に似ています。

ただし、ダイアログにカスタム ウィンドウの境界線を実装する場合、いつウィンドウをフラッシュする必要があるかわかりません。Windows はダイアログをフラッシュしません。

これが私が試したことです:

  • 所有者とダイアログの両方に送られるすべてのメッセージを見ましたが、ウィンドウを点滅させるためだけに存在するメッセージを見つけることができませんでした。

  • Spy++ をデフォルトの Windows ダイアログにフックしましたが、「フラッシュ」メッセージも見つかりませんでした。

WinUser.h を調べたところ、「フラッシュ」メッセージが見つかりませんでした。そのため、lParam と wParam が指定された 1 つ以上のメッセージの何らかの組み合わせであると想定しています。

誰かがこれを経験したことがありますか、それともおそらくこれを説明しているいくつかのページを教えてもらえますか? 私はこの問題に数か月間取り組んでいるので、どんなアイデアでも大歓迎です。

編集

コメントに応じて、現在使用しているコードは次のとおりです。

private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    if (msg == 0x0020)
    {
        if ((short)((long)lParam & 0xffff) == (-2))
        {
            short hiword = (short)((((long)lParam) >> 16) & 0xffff);

            if (hiword == 0x0201 || hiword == 0x0204)
                Flash(); // My function which simulates a window flash
        }
    }

    return IntPtr.Zero;
}
4

1 に答える 1

6

Windows がウィンドウのフラッシュを望んでいることを知らせるメッセージはありません。ただし、できることは、Windows が最初にウィンドウのフラッシュを開始するために使用するのと同じトリガーを監視することです。

WS_DISABLED無効になっている (スタイル ビットが設定されている) オーナー ウィンドウがあり、無効になっているウィンドウの任意の部分でユーザーがマウス ボタンをクリックすると、ウィンドウが点滅します。

内部的には、これは次のメッセージDefWindowProcに応答して処理されます。WM_SETCURSOR

  • lParam の下位ワードが の場合HTERROR、および
  • lParam の上位ワードは、マウス ボタン ダウン メッセージ (WM_LBUTTONDOWNなど)の 1 つです。
  • ウィンドウに有効な所有ポップアップ ウィンドウがある場合、
  • DefWindowProcFlashWindowExポップアップウィンドウで呼び出されます

したがって、自分でダイアログをフラッシュするタイミングのトリガーを特定するには、Windows と同じことを行うだけです。オーナー ウィンドウのウィンドウ プロシージャで、WM_SETCURSORメッセージを処理し、上記の 3 つのテストを実行します。3 つすべてが true の場合は、ダイアログに対して独自のカスタム フラッシュをトリガーできます。DefWindowProcそしてもちろん、そのような状況では、メッセージをハンドルに戻すことはありません。

于 2013-09-15T01:44:41.083 に答える