5

キオスク モードの一種として「ロックダウン」する必要がある Surface Pro があります。「キオスクモード」の更新が進行中であることは承知していますが、その前にこれを行う必要があります。

インターネットで検索しましたが、画面をスワイプしてもチャーム バーを無効にできないようです。トラックパッドを無効にする方法を見つけました..しかし、残念ながら、このタブレットはキーボードなしで使用されるため、チャーム バーを無効にする必要があります。

私の新しい考えは、チャーム バー HWND 全体を画面外に数千ピクセル移動するか、表示されないように Windows スタイルを設定することです。Spy++ とカスタムEnumWindowsベースのコンソール アプリを使用して、いくつかのウィンドウ ハンドルを取得しようとしましたが、有効にするのに十分な時間チャーム バーを開いたままにしておくことができません。

私の質問はHWND、Windows 8 でチャーム バーのウィンドウ ハンドル ( ) を見つけるにはどうすればよいですか? SetWindowLongまたは、またはをスローするためにチャーム バーへの参照を別の方法で取得するにはどうすればよいSetWindowPosですか?

4

5 に答える 5

7

実際、私はこれを行う方法を見つけました (明らかに、他の誰も持っていません:/)。

「Start8」や「SkipMetroSuite」などのソフトウェアは、キーを押してチャーム バーを停止します。彼らは文字通りキープレスをシミュレートして、タイトなループ内でそれを閉じます。

私は(私が思うに)より良い方法を見つけました。

まず、いくつかの WinAPI 関数:

using System.Runtime.InteropServices;
....

private enum WindowShowStyle : uint
{  // find more info at http://stackoverflow.com/a/8210120/1245420
   Hide = 0, ShowNormal = 1, ShowMinimized = 2, ShowMaximized = 3,
   ShowNormalNoActvate = 4, Show = 5, Minimize = 6, ShowNoActivate = 8,
   Restore = 9, ShowDefault = 10, ForceMinimized = 11
}

[DllImport("user32.dll", SetLastError = true)]
static extern System.IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
static extern System.IntPtr FindWindowByCaption(System.IntPtr ZeroOnly, string lpWindowName);

[DllImport("user32.dll")]
static extern bool ShowWindow(System.IntPtr hWnd, WindowShowStyle nCmdShow);

最初の問題はチャームバーです。このウィンドウのタイトルは、Charm Bar. このウィンドウを継続的に探して非表示にするスレッドを生成すると、うまく機能します。したがって、スレッドを生成し、継続的にポーリングします。

System.Threading.Tasks.Task.Factory.StartNew(() => {
    while (true) {
        System.IntPtr hWndCharmBar = FindWindowByCaption(System.IntPtr.Zero, "Charm Bar");
        ShowWindow(hWndCharmBar, 0);
        System.Threading.Thread.Sleep(100); // sleep for a bit
    }
});

これはうまく機能し、アプリを閉じてもチャームバーが機能し続けるという追加の利点があります. スレッドが CPU を壊すのThread.Sleepを止めるためにありますが、遅延により、チャーム バーが一瞬表示されることもあります。私はまだチャームバーを開いて、スレッドが再びそれを隠す前に十分速くボタンを押すことにまだ成功していないので、これは問題ありません. スリープ時間を短くすると、明らかにこれが速くなります。

Windows 8 のもう 1 つの問題は、何らかのスライダーがある場合 (私のアプリではListBox、ギャラリー用の画像が含まれています)、実際に画面の横にスライドできることです...そこに指を置いてアクセスしますタスクバー...

だから..次の部分は、タスクバーを閉じています:

IntPtr hWndTray = FindWindow("Shell_TrayWnd", null);
ShowWindow(hWndTray, 0);

..次に、アプリを閉じるときにもう一度表示します。

IntPtr hWndTray = FindWindow("Shell_TrayWnd", null);
ShowWindow(hWndTray, 1);

機能的には、これが私のアプリに必要なすべてです。それが誰かを助けることを願っています。

于 2013-07-06T06:25:25.663 に答える
1

アプリケーションを起動するときに 2 つのレジストリ キーを変更し、アプリケーションを閉じるときにそれらを復元するのが最も簡単で良い方法ですか?

必要なのは、(存在しない場合) EdgeUIキーを次の下に作成することだけです。

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\ImmersiveShell

新しい DWORD キーを追加します: DisableTLcorner & DisableCharmsHint

無効にする場合:

DisableTLcorner = 1 DisableCharmsHint = 1

ゼロへの変更を有効にするか、それらを削除するには:

DisableTLcorner = 0 DisableCharmsHint = 0

これはすべて、任意の言語を使用してプログラムで簡単に実行できます!!!!

于 2015-10-03T11:46:15.300 に答える
1

また、時計は「Clock and Date」というキャプションのあるウィンドウに含まれていることにも注意してください。

IntPtr hWndCharmClock = FindWindowByCaption(IntPtr.Zero, "Clock and Date");

チャーム バーを切り替える小さなアプリケーションを作成しました: https://bitbucket.org/darkwingduck/charmsbartoggle/overview

于 2013-08-26T15:09:42.463 に答える
0

チャームバーがアクティブになるたびにアプリケーションが非アクティブになるため、すぐに再アクティブ化するとチャームバーが消えます。これを App.xaml.cs に追加します

 private enum WindowShowStyle : uint
    {  // find more info at http://stackoverflow.com/a/8210120/1245420
        Hide = 0, ShowNormal = 1, ShowMinimized = 2, ShowMaximized = 3,
        ShowNormalNoActvate = 4, Show = 5, Minimize = 6, ShowNoActivate = 8,
        Restore = 9, ShowDefault = 10, ForceMinimized = 11
    }

    [DllImport("user32.dll", SetLastError = true)]
    static extern System.IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
    static extern System.IntPtr FindWindowByCaption(System.IntPtr ZeroOnly, string lpWindowName);

    [DllImport("user32.dll")]
    static extern bool ShowWindow(System.IntPtr hWnd, WindowShowStyle nCmdShow);

    DispatcherTimer timer = new System.Windows.Threading.DispatcherTimer();
    public App()
    {
        this.Deactivated += App_Deactivated;
        this.Activated += App_Activated;
        timer.Tick += delegate
        {
            Application.Current.MainWindow.Activate();
            System.IntPtr hWndCharmBar = FindWindowByCaption(System.IntPtr.Zero, "Charm Bar");
                            ShowWindow(hWndCharmBar, 0);
        };
        timer.Interval = new TimeSpan(0, 0, 0, 0, 10);
    }

    void App_Activated(object sender, EventArgs e)
    {
        timer.Stop();
    }

    void App_Deactivated(object sender, EventArgs e)
    {
        timer.Start();
    }
于 2015-11-25T17:27:21.510 に答える