关闭Windows 8 Charm Bar

Sim*_*ead 5 c# c++ windows-8 windows-rt

我有一个Surface Pro,我需要"锁定"作为一种Kiosk模式.我知道有一个更新正在为"Kiosk模式"..但我需要在此之前这样做.

我在互联网上搜索过,但看起来你无法通过屏幕上的滑动禁用魅力栏.我已经找到了禁用触控板的方法..但不幸的是,由于这款平板电脑将在没有键盘的情况下使用,我需要禁用魅力吧.

我的新想法是将整个Charm条HWND移出屏幕数千个像素,或者,可能在其上设置一个窗口样式,以便它不会出现.我试图使用Spy ++和一个EnumWindows基于自定义的控制台应用程序给我一些Window句柄..但是我不能让Charm栏打开足够长的时间让它们生效.

所以我的问题是:如何HWND在Windows 8中找到Charm Bar 的Window Handle()?或者,我怎样才能以其他方式获得Charm栏的引用以便抛出SetWindowLong或者抛出SetWindowPos它?

Sim*_*ead 7

事实上,我已经找到了一种方法(显然,没有其他人有:/).

对于那些想知道的人来说,像"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);
Run Code Online (Sandbox Code Playgroud)

所以首先出现的问题是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
    }
});
Run Code Online (Sandbox Code Playgroud)

这很有效,并且在应用程序关闭时使Charm Bar继续工作的额外好处.在Thread.Sleep有停止线程砸CPU -却迟迟还允许魅力酒吧出现的一瞬间.我还没有成功打开Charm Bar并按下一个按钮,然后线程再次隐藏它,所以这很好.降低睡眠时间显然会使这更快.

Windows 8的另一个问题是,如果你有某种滑块(在我的应用程序中,我有一个ListBox包含图库的图像),那么你实际上可以滑到屏幕的一侧...把手指放在那里,并访问任务栏......

那么..下一部分是关闭任务栏:

IntPtr hWndTray = FindWindow("Shell_TrayWnd", null);
ShowWindow(hWndTray, 0);
Run Code Online (Sandbox Code Playgroud)

..然后我再次在app关闭时显示:

IntPtr hWndTray = FindWindow("Shell_TrayWnd", null);
ShowWindow(hWndTray, 1);
Run Code Online (Sandbox Code Playgroud)

从功能上讲,这就是我的应用所需的全部内容.希望能帮助别人.