在全屏运行多点触控应用程序时禁用Windows 8的边缘手势/热角。

13

我有一个全屏AS3游戏,可能是使用Adobe AIR在Windows 7上运行的。 在这个游戏中,退出可能不容易(考虑展会模式,只能通过按esc并输入密码来退出)。

现在我想让这个游戏在Windows 8中运行。 游戏像预期的那样工作,但令人烦恼的是这些边缘手势/热角(左、上、右、下)和快捷方式。

我读了一些文章,但没有帮助我。 人们谈论注册表编辑,但我无法使其工作+用户需要重新启动计算机。

我想打开我的游戏,关闭手势/热角,当游戏关闭时,手势/热角需要再次可用。

我见过一些应用程序实现了我想要实现的相同功能。

我找到了this,所以我能够检测手势。 但如何忽略它们的操作呢?

我还阅读了ASUS Smart Gestures,但这是针对触摸板的。

我尝试过Classic Shell,但我需要在不使用此类程序的情况下即时禁用边缘手势/热角。

我还找到了this,但我不知道如何实现它。

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;
}

有人知道我怎么做吗?或者能指引我正确的方向吗?

我已经在C#和C ++中尝试了一些,但我不是熟练的C#/C ++开发人员。而且游戏是用AS3制作的,所以很难在C#/C ++中实现。

我使用运行Windows 8的Lenovo aio(多合一)


据我所知,全屏/非商店应用程序允许这样做。正如MSDN文档所说,“此属性对Windows商店应用程序无效。”。 - Johan B
1
我的应用程序将不会在商店中提供。这是一个目前在Windows 7上运行的游戏。在Windows 8中唯一的区别就是这些令人讨厌的边缘。 - Ron van der Heijden
也许可以使用窗口句柄和布尔值调用该函数?ULONG result; result = SetTouchDisableProperty(GetForegroundWindow(), true); 或类似的方式?不确定,因为我没有做过桌面应用程序。 - Software Developer
不,我不能期望用户使用Windows 7模式来运行我的游戏。 - Ron van der Heijden
你是如何解决的?使用批处理吗? - user1620350
显示剩余4条评论
4个回答

7

我正在使用C#为Windows 8制作一款自助终端应用程序,成功地通过关闭资源管理器进程来禁用滑动手势。虽然我不知道如何在C++中实现这个功能,但在C#中可以这样做。

var explorers = Process.GetProcessesByName("explorer");
            foreach (var explorer in explorers) {
                explorer.Kill();
            }

在我的程序结束事件中,我只是重新启动了该进程。
Process.Start("explorer.exe");

在此之前,您可能需要编辑注册表以防止资源管理器在您关闭它后重新启动。
在注册表编辑器中转到以下路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
将AutoRestartShell的值设置为0。

您是我的英雄。我使用了这种方法来创建成功的Chrome kiosk应用程序。谢谢您。 - Matyas

6
只要您在使用AIR,就可以使用AIR 2.0的NativeProcess来执行它。
从那里,我能想到两个解决方案:
1. 如果Classic Shell中有命令行选项,则从AS3中调用它,并通过它切换手势开/关。 2. 编写一个C++应用程序,手动切换手势开/关。
如果您可以在C++中使该示例正常工作,请添加一些代码以处理on/off命令行参数,并在AS3应用程序初始化和退出时调用C++ exe进行切换。
我在这里(在工作中)没有安装C++,但是看起来该C++函数只需要您应用程序的窗口句柄(hWnd)。此教程可以使您编译并运行,但您看到的窗口句柄将是C++应用程序窗口的窗口句柄。
访问 flash 窗口的句柄会稍微复杂一些:

不管哪种方法,你都需要使用进程名称或 ID 来识别它作为 AS3 进程。

此解决方案还取决于你是否能够在客户端计算机上安装除 AIR 应用程序以外的其他东西。(例如 .NET 运行时、C++ 运行时、经典 Shell 安装程序)


我很乐意帮忙处理C++/.NET/Windows的相关问题,但要等到今晚稍晚些时候(这里是下午3:30)- 当我还在从事AS3和信息亭工作时,我们不得不使用许多定制的、hacky的解决方案,你简直无法想象。 - Jono
1
感谢您提供这个有用的答案。是的,我的游戏使用Adobe Air运行。您指的是Classic Shell程序吗?如果是这样,我不能期望用户已经安装了它。我尝试创建C++应用程序并下载了“Windows Hello World Sample”,但是这个示例在Windows 8中无法正常工作。如果我将上面的代码片段粘贴到这个Hello World示例中,我会发现“IPropertyStore”不存在。我找到了“IPropertyStorage”,但是这个(接口?)不包含“pPropStore->SetValue”。我从未使用过C ++,它看起来对我来说真的很难。 - Ron van der Heijden

4

我正在尝试做同样的事情。下面的C++代码可以禁用每个运行中的应用程序/窗口上的Win8手势。正如JonoRR所提到的,下一步是仅在您想要定位的HWND上调用它。如果目标应用程序关闭,然后重新打开,手势将会恢复。

#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]));
    SetTouchDisableProperty(hWnd,true);

    _tprintf(_T("Value is %s\n"), title);

    return TRUE;
}

int _tmain(int argc, _TCHAR* argv[])
{   
    EnumWindows(MyEnumProc, 0);
    return 0;
}

1
以下答案基于Dovogja的精彩回答,但使用了批处理文件来完成。这样,您只需使用launch.bat启动即可。
Windows魅力栏由explorer.exe操作。因此,如果您的应用程序可以在没有它的情况下运行,则可以通过首先禁用explorer.exe的自动重启来绕过它:(以管理员身份运行)
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"

;; after you close both the app window and the opened chrome window relaunch explorer.exe to give back the functionality to windows
explorer.exe

我使用上述方法来让一个无键盘的信息亭应用程序运行。因为有了键盘,你仍然可以用 alt+f4 关闭应用程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接