事实上,我已经找到了一种方法来做到这一点(显然,没有其他人有:/)。
对于那些想知道的人,像“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);
从功能上讲,这就是我的应用程序所需的全部内容。希望对某人有所帮助。