事实上,我已经找到了一种方法来做到这一点(显然,没有其他人有:/)。
对于那些想知道的人,可以使用“Start8”和“SkipMetroSuite”等软件按轮询键来停止 Charm Bar。他们从字面上模拟按键以将其关闭在一个紧密的循环中。
我找到了(我认为是)更好的方法。
首先...一些 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。这个窗口的标题是,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
}
});
这样做效果很好,并带来了额外的好处,即在应用程序关闭时,Charm Bar 可以继续工作。这Thread.Sleep
是为了阻止线程破坏 CPU - 但延迟也允许 Charm Bar 瞬间出现。我还没有成功打开超级按钮栏并在线程再次隐藏它之前足够快地按下按钮,所以这很好。减少睡眠时间显然可以让这个过程更快。
Windows 8 的另一个问题是,如果您有某种滑块(在我的应用程序中,我有一个ListBox
包含画廊的图像)然后您实际上可以滑动到屏幕的一侧...将手指放在那里,然后访问任务栏...
所以..下一部分是关闭任务栏:
IntPtr hWndTray = FindWindow("Shell_TrayWnd", null);
ShowWindow(hWndTray, 0);
..然后我在应用程序关闭时再次显示它:
IntPtr hWndTray = FindWindow("Shell_TrayWnd", null);
ShowWindow(hWndTray, 1);
从功能上讲,这就是我的应用程序所需的全部内容。希望对某人有帮助。