1

非標準のハードウェア ボタン メッセージを待機し、(CreateProcess を使用して) アプリケーションを実行する隠しプロセスがあります。ユーザーが邪魔しても問題ありません。ユーザーが自分で承認したアクションです。タスクバーが表示され、キャプション付きウィンドウとキャプションなしウィンドウが複数ある通常のレイアウトであれば、すべて問題ありません。ただし、現在のアプリケーションが全画面表示の場合、XP と 7 では状況が異なります。この場合のフルスクリーン アプリケーションは、画面とまったく同じ寸法の境界線のないウィンドウです。Windows は、常にオンになっている場合でも、そのようなアプリケーションのタスク バーを非表示にします。

Xp では問題ありません。この場合はタスクバーが表示され、アプリケーション (電卓など) も表示されます。フルスクリーン アプリは、起動したアプリとタスクバー以外の領域でも表示されます。しかし、Windows 7 では何も視覚的に表示されず、フルスクリーン アプリはオンのままで、タスクバーに切り替えると、実行されたアプリケーションが表示されます。SetForegroundWindow、BringWindowToTop、CreateProcess-WaitForIntputIdle-EnumThreadWindows で見つかったウィンドウ ハンドルの AllowSetForegroundWindow(GetCurrentProcessId()) 呼び出しで解決しようとしましたが、変更はありません。XP以降、公式に文書化されているフルスクリーンウィンドウに関連して何か変更がありましたか?

ありがとう、

マックス

4

3 に答える 3

1

Vista では、デスクトップ コンポジション機能が導入されました。つまり、すべてのウィンドウがメモリ ビットマップに描画され、デスクトップ ウィンドウ マネージャーがこれらのビットマップを構成し、フルスクリーンの Direct3D サーフェスに描画します。フルスクリーン ウィンドウはデスクトップ コンポジションに参加せず、画面に直接描画できます (ほとんどの場合、フルスクリーン アプリの大部分はリアルタイムの画面更新が必要なゲームであるため)。

特に、これは、全画面表示のアプリが起動して実行されている場合、DWM で構成された画像をカバーしているため、ユーザーは、DWM が全画面表示のアプリの上に描画を開始するために、DWM 管理のウィンドウに切り替える必要があることを意味します。

残念ながら、あなたの問題に対する良い解決策はありません。これを解決する 1 つの方法は、アプリに WS_CAPTION スタイルを追加して、WM_NCPAINT/ WM_NCCALCSIZE/WM_NCHITTEST自分で処理することです。これにより、通常のウィンドウ アプリケーションであると DWM に嘘をつくことができますが、NC 領域を視覚的に変更して、タイトルがないように見えます。ただし、これにはある程度の追加コードが必要であり、投資したい労力が少し増える可能性があります。

問題を解決する別の方法は、新しいプロセスを起動するときにフルスクリーン アプリケーション ウィンドウを明示的に最小化することです。ただし、いつ再び最大化するかという問題を解決する必要があります。

ところで、 Raymond Chen からのこの投稿へのコメントが興味深いかもしれません。

于 2010-06-30T09:05:08.450 に答える
1

独自のハードウェア デバイスをお持ちの場合、「実際の」ユーザー入力を生成するための API があると思います。明らかに従来のキーボードとマウス、そして現在の USB HID ドライバー (その多くはユーザーモードだと思いますか?) は、そのための API にアクセスできます。

たとえば、Synergy+ は、接続された PC で偽のキーボードおよびマウス イベントを生成することができ、偽の入力の結果として、Windows の切り替えが正常にアクティブ化されます。

したがって、私の最初のアイデアは、ユーザーモードの「デバイス」アプリケーションが実際のキーボードメッセージを合成することです.SendInputは、「実際のユーザー入力イベントを「偽造」できるAPI」の候補と思われます.

次に、「UI」アプリで RegisterHotKey などの API を使用して、デバイス アプリが生成するホットキーの組み合わせに応答します。

ここで、(SendInput が正しいレベルでユーザー入力イベントを生成していると仮定して)、(UI アプリの WM_HOTKEY ハンドラー内から) フォアグラウンド ウィンドウを (自分自身に) 変更するためのアクセス許可を (すべてが「ユーザーによって開始された」ため) 持つ必要があります。 .

于 2010-06-30T10:28:22.133 に答える
0

Windows は複数のデスクトップをサポートしており、全画面表示ではデフォルトのデスクトップ (アプリケーションが表示される場所) とは異なるデスクトップが使用されていると思います。Windows のデスクトップ オブジェクトは、「論理的な表示面であり、ウィンドウ、メニュー、フックなどのユーザー インターフェイス オブジェクトが含まれています」。たとえば、通常、スクリーン セーバーは別のデスクトップで起動されます。

Process Explorer を使用して、アプリケーションが実行されているデスクトップを確認できます。

  • Process Explorer を設定して、タスク マネージャーを置き換え、常に最上位で実行するようにします。
  • 全画面表示になったら、Ctrl + Shift + Esc を押して Process Explorer を起動します。
  • Process Explorer 内で、全画面プロセスを選択し、Ctrl + H を押して、このプロセスのハンドルを表示します。
  • リスト内のデスクトップアイテムの値を確認します。通常、これはデフォルトに設定されます

このアプリが実行されているデスクトップがわかっている場合は、最初に呼び出しOpenDesktopてこのデスクトップへのハンドルを取得し、それを呼び出しの に渡すことSTARTUPINFOで、同じデスクトップでプロセスを開始できますCreateProcess

于 2010-06-30T08:55:08.583 に答える