15

WPF を使用してアプリケーションのような「ガジェット」を作成しようとしています。目標は、通常の Windows 7 ガジェットと同じ動作を実現することです。

  • タスクバー エントリなし
  • Alt+Tab ウィンドウで表示されない
  • 常に最上位にあるとは限りません。アプリケーションが最上位になる可能性があります
  • 「Aero Peek」の実行中に表示
  • 「デスクトップの表示」/ Windows+D の使用中に表示

最初の 4 つの目標は達成できましたが、5 番目の問題の解決策を見つけることができませんでした。最も近いのは、WPF で AppBar ドッキング (WinAmp のような画面の端に) を行う方法のユーティリティ クラスを使用することです。、しかし、これによりアプリが「ツールバー」に変わり、ガジェットGUIが配置されている画面の部分からアプリケーションが追放されます。

同様の質問が以前に Stackoverflow で行われたことがわかりますが、解決策が見つかる前に解決されました。とにかく、これを解決する知識を持った誰かがそこにいることを期待して投稿します =)

4

4 に答える 4

1

XBAPを作成することにより、WPFを使用して実際のWindowsガジェットを実装できます。XBAPをロードするIFRAMEのみを含むgadget.xmlファイルと.htmlファイルを追加するだけです。そうすれば、WPFアプリケーションは実際にはガジェットになり、すべてのルールに自動的に従います。

もう1つのオプションは、Windowsサイドバースタイラーを使用することです。これには、追加のソフトウェアを一緒にインストールする必要がありますが、コード署名証明書やユーザー認証などがないと、XBAPサンドボックス内では実行できないことも実行できます。

3番目のオプションは、HTMLで認識できるもの(特定の背景色など)を使用するガジェットを作成し、.exeが起動したら、エクスプローラーで探している属性を持つhWndをスキャンし、自分自身を挿入することです。 Explorer.exeプロセスを実行し、ウィンドウをその子として設定します。

3番目のオプションのバリエーションは、Explorer.exeに挿入するのではなく、Zインデックスと場所を(SetWindowPosを使用して)維持して、見つかったhWndのZインデックスと場所を追跡することです。

非常に多くの選択肢...

于 2010-03-11T20:50:32.627 に答える
1

Topmost を true に設定してみてください。アプリケーションがフォーカスを失った場合、Opacity を 0 に設定できます。

私はこのXamlをしました:

<Window x:Class="OpacTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Topmost="True" Background="Transparent" ShowInTaskbar="False" AllowsTransparency="True" WindowStyle="None" Width="400" Height="300">
    <Grid>
       <Border Background="Black" CornerRadius="5" />
    </Grid>
</Window>

私はウィンドウ用にC#でこれを行いました:

protected override void OnActivated(EventArgs e)
{
    base.OnActivated(e);

    Opacity = 1;
}

protected override void OnDeactivated(EventArgs e)
{
    base.OnDeactivated(e);

    Opacity = 0;
}

これで途中まで進みます。デスクトップがフォーカスされたかどうかを知る方法が必要です。

デスクトップ ウィンドウの WndProc イベントにフックして WM_ACTIVATE を探すことで、これを実行できるはずです。

あなたは出来る:

  • GetDesktopWindow を呼び出して、デスクトップ ウィンドウのハンドルを取得します。
  • ap/invoke 呼び出しを使用して、WndProc のコールバックを設定します
  • WM_ACTIVATE または適切な Windows メッセージを処理し、不透明度を 1 に戻します。
于 2010-03-11T19:59:07.410 に答える
0

「ガジェット」のような動作を実現する 1 つの解決策は、ウィンドウをデスクトップの子にすることです。このようにして、Windows + D を押しても、ウィンドウは常にデスクトップに表示されます。ここでそれがどのように行われるかを見ることができます: Window "on desktop" .

于 2011-04-23T16:53:48.470 に答える