13

我有一个在 Windows 7 中运行的带有 Adob​​e AIR 的全屏 AS3 游戏。在这个游戏中,退出可能并不容易(想想 kiosk 模式,只能通过按下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;
}

有谁知道我该怎么做?或者指出我正确的方向?

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

我在使用 Windows 8的联想 aio(一体机)上工作。

4

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。

于 2013-03-21T09:13:28.237 回答
6

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

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

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

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

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

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

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

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

此解决方案还取决于您在客户端 PC 上安装 AIR 应用程序以外的其他东西的能力。(即 .NET 运行时、C++ 运行时、经典 Shell 安装程序)

于 2012-11-29T02:30:56.387 回答
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;
}
于 2013-02-09T00:48:11.770 回答
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

于 2014-08-26T07:17:32.510 回答