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

时间:2012-11-20 10:47:17

标签: actionscript-3 windows-8 gestures charms-bar

我有一个在Windows 7中运行的带有Adobe AIR的全屏AS3游戏maby。 在这个游戏中可能不容易退出(考虑信息亭模式,只需按 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 (All in one)

4 个答案:

答案 0 :(得分: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。

答案 1 :(得分:6)

(只要您运行AIR - 它听起来像)您可以使用AIR 2.0的NativeProcess来执行它。

从那里我可以想到两个解决方案:

  1. 如果Classic Shell中有命令行选项,请从AS3中调用它,并通过它切换手势。

  2. 编写一个C ++应用程序,手动打开/关闭手势。

  3. 如果您可以使用C ++进行该示例,请在C ++中添加一些内容来处理开/关命令行参数,并在初始化时调用C ++ exe并退出AS3应用程序以进行切换。

    我没有安装C ++(在工作中),但看起来C ++函数只需要应用程序的窗口句柄(hWnd)。 This tutorial应该让你编译并运行,但是你看到的窗口句柄将用于C ++应用程序的窗口。

    访问闪存窗口的句柄会稍微困难一些:

    无论哪种方式,您都需要使用流程名称或ID将其标识为您的AS3流程。

    此解决方案还取决于您在客户端PC上安装AIR应用程序以外的功能。 (即.NET运行时,C ++运行时,Classic Shell安装程序)

答案 2 :(得分: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;
}

答案 3 :(得分:1)

以下答案基于Dovogja's brilliant answer,但它使用批处理文件来执行此操作。这样您就必须使用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 关闭应用。