gpt4 book ai didi

c# - 关闭 Windows 8 Charm Bar

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:07:48 24 4
gpt4 key购买 nike

我有一台 Surface Pro,我需要将其“锁定”为一种 Kiosk 模式。我知道“Kiosk 模式”的更新正在进行中。但是我需要在此之前执行此操作。

我在整个互联网上搜索过,但似乎无法通过在屏幕 上滑动来禁用 Charm 栏。我找到了禁用触控板的方法。但不幸的是,由于这款平板电脑将在没有键盘的情况下使用,我需要禁用 Charm 栏。

我的新想法是将整个 Charm 栏移出屏幕 HWND 数千像素,或者,可能在其上设置一个窗口样式,使其不显示。我曾尝试使用 Spy++ 和基于自定义 EnumWindows 的控制台应用程序来为我提供一些窗口句柄。但是我无法让 Charm 栏打开足够长的时间以使它们生效。

所以我的问题是:如何在 Windows 8 中找到 Charm Bar 的窗口句柄 (HWND)?或者,我怎样才能以其他方式获得对 Charm 栏的引用,以便向其抛出 SetWindowLongSetWindowPos

最佳答案

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

对于那些想知道的人,“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 出现一瞬间。我还没有成功打开 Charm Bar 并在线程再次隐藏它之前足够快地按下按钮,所以这很好。缩短 sleep 时间显然可以加快速度。

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

所以..下一部分是关闭任务栏:

IntPtr hWndTray = FindWindow("Shell_TrayWnd", null);
ShowWindow(hWndTray, 0);

..然后我在应用关闭时再次显示它:

IntPtr hWndTray = FindWindow("Shell_TrayWnd", null);
ShowWindow(hWndTray, 1);

在功能上,这就是我的应用程序所需的全部内容。希望对某人有所帮助。

关于c# - 关闭 Windows 8 Charm Bar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17470664/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com