事实上,我已经找到了一种方法来做到这一点(显然,没有其他人有:/)。
对于那些想知道的人,“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。产生一个不断寻找这个窗口并隐藏它的线程效果很好。所以我产生了一个线程,并不断地轮询它:
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);
从功能上讲,这就是我的应用所需要的全部内容。希望对某人有所帮助。