7

(他のアプリケーションから)ウィンドウを前面に表示したい。現在使用しているもの:

::SetWindowPos(hwnd, GetForegroundWindow(), 0, 0, 0, 0, SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);

正常に動作しますが、(私にはわからない)場合によっては、ウィンドウが常に一番上に表示されます。MSDNによるとHWND_NOTOPMOST、代わりに使用する必要がありますGetForegroundWindow()が、機能しません。ウィンドウは他の(常に上にあるとは限りません)ウィンドウの下にとどまります。

ウィンドウをアクティブにせずに前面に表示するにはどうすればよいですか?

4

1 に答える 1

12

他のアプリケーションのウィンドウを一時的に「最上位」にして、アクティブ化せずに前面に表示することができます。最初に呼び出しHWND_TOPMOSTで「hWndInsertAfter」としてSetWindowPos指定し、次にHWND_NOTOPMOST2番目の呼び出しで指定します(両方の呼び出しSWP_NOACTIVATEは「uFlags」で)。操作の結果としてすでに最上位にあるウィンドウの最上位スタイルを削除するリスクがある場合は、WS_EX_TOPMOSTを呼び出してex-styleを事前にテストできますGetWindowLong[Ptr]

他のアプリケーションのウィンドウを前面に配置する必要がある特定のウィンドウがある場合(すべてのウィンドウの前面に配置するのではなく)、そのウィンドウの所有者を一時的に前面に配置する必要のあるウィンドウに設定できます。GetWindowLong[Ptr]withGWL_HWNDPARENTを使用して、ウィンドウの元の所有者を保存し、次にを呼び出してSetWindowLong[Ptr]一時的な所有者を設定し、次にSetWindowPoswithを呼び出しHWND_TOP、次に元の所有者を再びに復元するために使用できますSetWindowLong[Ptr]

于 2011-03-10T13:54:31.313 に答える