実際、私はこれを行う方法を見つけました (明らかに、他の誰も持っていません:/)。
「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);
機能的には、これが私のアプリに必要なすべてです。それが誰かを助けることを願っています。