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

Ron*_*den 13 actionscript-3 gestures windows-8 charms-bar

我有一个全屏AS3游戏maby与Adobe AIR在Windows 7中运行.在这个游戏中它可能不容易退出(想想自助服务终端模式,只需按下esc并输入密码退出).

现在我希望这款游戏能够在Windows 8中运行.游戏的工作方式与预期的一样,但令人讨厌的事情是这些边缘手势/热门角落(左,上,右,下)和快捷方式.

我读过文章,但没有人帮助我.人们谈论注册编辑,但我没有得到这个工作+用户需要重新启动他/她的计算机.

我想打开我的游戏,关闭手势/热门角落,当游戏关闭时,手势/热门角落需要再次回来.

我看到一些应用程序正在做我想要完成的事情.

我找到了这个,所以我能够检测出手势.但是如何忽视他们的行动呢?

我也阅读华硕智能手势,但这是触摸板.

我已经尝试过Classic Shell,但我需要在没有这些程序的情况下禁用边缘手势/热角,只需动态即可.

我也找到了这个,但我不知道如何实现这一点.

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;
}
Run Code Online (Sandbox Code Playgroud)

有谁知道我怎么做到这一点?还是指出我正确的方向?

我在C#和C++中尝试了一些,但我不是一个熟练的C#/ C++开发人员.此外,游戏是在AS3中制作的,因此很难在C#/ C++中实现.

我在Windows 8 上使用Lenovo aio(All in one).

小智 7

我正在使用C#为Windows 8制作一个信息亭应用程序,我在程序启动时通过杀死资源管理器进程成功禁用了滑动手势.我不知道它是如何在C++中完成的,但在C#中它是这样的.

var explorers = Process.GetProcessesByName("explorer");
            foreach (var explorer in explorers) {
                explorer.Kill();
            }
Run Code Online (Sandbox Code Playgroud)

在我的程序结束时,我再次开始这个过程.

Process.Start("explorer.exe");
Run Code Online (Sandbox Code Playgroud)

在此之前,您可能必须编辑您的注册表以防止资源管理器在您杀死它后重新启动.

在注册表中去

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon

将AutoRestartShell设置为0.


Jon*_*ono 6

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

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

  1. 如果Classic Shell中有命令行选项,请从AS3中调用它,并通过它打开/关闭手势.

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

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

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

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

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

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


小智 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;
}
Run Code Online (Sandbox Code Playgroud)