5

最初に「なぜ必要なのか」という回答が予想されるので、なぜ必要なのかを最初に説明します。マウスカーソルが画面の端にあることを検出したいのですが、フックを使用したくありません。したがって、1ピクセル幅のTOPMOST非表示ウィンドウを作成しました。

私はWinXPでC++を使用しているので、ウィンドウが作成されると(CreateWindowEx(WS_EX_TOPMOST | WS_EX_TRANSPARENT ...)すべてが正常に機能します。

残念ながら、ユーザーが別の最上部のウィンドウ、たとえばタスクバーをウィンドウ上で移動した場合、マウスは移動しません。

私はこれを、「MDIウィンドウを常にトップに保つ方法」で提案されているアプローチと同様に解決しようとしました。

最初にWM_WINDOWPOSCHANGEDで一番上のウィンドウのZオーダーをチェックしようとしました

case WM_WINDOWPOSCHANGED :
    WINDOWPOS* pWP = (WINDOWPOS*)lParam;

それでも、pWP-> hwndは私のウィンドウを指し、pWP-> hwndInsertAfterは0です。これは、タスクバーで覆われていても、私のウィンドウがZの上部にあることを意味します。それから私は試しました:

case WM_WINDOWPOSCHANGED :
    HWND topWndHndl = GetNextWindow(myHandle, GW_HWNDPREV)
    GetWindowText(topWndHndl, pszMem, cTxtLen + 1);

そして、「デフォルトのIME」ウィンドウが私のウィンドウの上にあることが常にわかります。SetWindowPos()またはBringWindowToTop()を使用してウィンドウを一番上に表示しようとしても、「デフォルトのIME」が一番上に残ります。「デフォルトIME」とは何か、タスクバーがウィンドウの上部にあるかどうかを検出する方法がわかりません。

だから私の質問は:私の一番上のウィンドウがもう一番上のウィンドウではないことを検出する方法とそれを一番上に保つ方法は?

PS定期的にウィンドウを一番上に表示する「ブルートフォース」アプローチは機能しますが、醜く、たとえば通知ウィンドウで望ましくない推論が発生する可能性があることを私は知っています。(ウィンドウを一番上に移動すると、通知ウィンドウが非表示になります。)

あなたの時間と提案に感謝します!

4

1 に答える 1

8

TopMostは、常に注意が必要です。自分自身をTopMostとして指定する別のウィンドウをオーバーライドする方法はありません。

レイモンド・チェンはこれについて良い記事を持っています。

また、これの複製。

于 2010-06-17T22:21:01.593 に答える