我们需要在我们的一个应用程序中,我们需要禁用Windows 8的一些内置手势,以防止用户离开应用程序。 (想想kiosklogin屏幕)。 是否有方法仍然允许用户使用触摸与应用程序进行交互,但禁用/拦截一些内置的手势(如停靠在左侧的应用程序,到桌面等)。
我们的备份解决scheme是在某些屏幕上完全禁用触摸屏(这是我们可以做的事情),但是我们希望获得更好的用户体验,并禁用我们绝对需要的手势(类似于禁用Windows键,ctrl + alt + del而不是整个键盘)。
最初的search和调查还没有find我们一直在寻找的东西,所以我们要么寻找错误的东西,要么在错误的地方寻找。
您可以在Windows 8 Embedded中禁用手势。 也许你可以在Windows 8中试试这个。
注册表项:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ImmersiveShell\EdgeUI] "DisabledEdges"=dword:0000000f 0x01 : Disables left edge input and app switcher gesture. 0x02 : Disables right edge input and charm bar gesture. 0x04 : Disables top edge input and top application bar gesture. 0x08 : Disables bottom edge input and bottom application bar gesture.
如果要禁用每个手势,只需添加双字:0000000f(15)
要以编程方式执行此操作,可以在下面的链接中调用该函数。 它需要hWnd到你想要的目标窗口。
http://msdn.microsoft.com/en-us/library/windows/desktop/jj553591%28v=vs.85%29.aspx
下面的C ++将搜索窗口标题为“helloworld”的窗口,并禁用所有的Windows 8手势。 这不适用于Windows应用商店应用程序,并且该功能必须在窗口打开时调用。 如果应用程序关闭并重新打开,手势将返回。 另外,我相信它只适用于全屏的应用程序。
#include "stdafx.h" #include <windows.h> #include <iostream> #include <propsys.h> #include <propkey.h> using namespace std; HWND windowHandle; HRESULT SetTouchDisableProperty(HWND hwnd, BOOL fDisableTouch) { IPropertyStore* pPropStore; HRESULT hrReturnValue = SHGetPropertyStoreForWindow(hwnd, IID_PPV_ARGS(&pPropStore)); if (SUCCEEDED(hrReturnValue)) { PROPVARIANT var; var.vt = VT_BOOL; var.boolVal = fDisableTouch ? VARIANT_TRUE : VARIANT_FALSE; hrReturnValue = pPropStore->SetValue(PKEY_EdgeGesture_DisableTouchWhenFullscreen, var); pPropStore->Release(); } return hrReturnValue; } BOOL CALLBACK MyEnumProc(HWND hWnd, LPARAM lParam) { TCHAR title[500]; ZeroMemory(title, sizeof(title)); GetWindowText(hWnd, title, sizeof(title)/sizeof(title[0])); if (!_tcscmp(title, _T("helloworld"))) { SetTouchDisableProperty(hWnd,true); } return TRUE; } int _tmain(int argc, _TCHAR* argv[]) { EnumWindows(MyEnumProc, 0); return 0; }
Windows魅力栏由explorer.exe
操作。
因此,如果您的应用程序可以运行没有它,那么你可以通过(以管理员身份运行)首先禁用explorer.exe的autorestart来破解它:
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "AutoRestartShell" /t REG_DWORD /d 0
然后下面的代码代表我的launch.bat
– 最终按预期工作:
;; kill explorer (this disables all windows functionalities taskkill /f /im explorer.exe ;; start your kiosk app - should block the batch execution (so explorer.exe doesn't get executed at the end) "\path\to\your\app.exe" ;; relaunch explorer.exe after you close the app to give back the functionality to windows explorer.exe
我使用上述方法让无键盘的应用程序运行。 因为使用键盘,您仍然可以使用alt + f4关闭应用程序。
将IsTapEnabled , IsDoubleTapEnabled , IsRightTapEnabled和IsHoldingEnabled设置为false应禁用UI元素中的手势,但它们是属性,而不是方法。 我还没有看到一种方法,将禁用所有手势的特定元素。
我知道如果禁用每个控件来响应手势将是荒谬的,但是如果您需要从Root到Children的字面上禁用所有控件,那么在根上创建attach属性并将这些属性设置为false可能是一个解决方案。
手势由explorer.exe处理。 如果你用你的应用程序替换了Windows Shell(默认:explorer.exe),那么在操作系统级别没有更多的手势。
注册表项:
HKEY_LOCAL_MACHINE \ SOFTWARE \微软\ Windows_NT \ CURRENTVERSION \ Winlogon中\
键:“Shell”(REG_SZ)=“path_to_your_application”
您也可以只为当前用户(HKEY_CURRENT_USER \ SOFTWARE \ Microsoft \ Windows_NT \ CurrentVersion \ Winlogon)
至少在8.1中,似乎有一个称为“分配访问”的功能:
http://windows.microsoft.com/en-us/windows-8/assigned-access
设置>更改PC设置>帐户>其他帐户>为分配的访问设置帐户