13

Windows 7 で動作する Adob​​e AIR を使用したフルスクリーンの AS3 ゲームを持っています。このゲームでは、簡単に終了できない場合があります (キオスク モードについて考えてみてください。終了するescには、パスワードを押して入力する必要があります)。

今、私はこのゲームを Windows 8 で実行したいと考えています。ゲームは期待どおりに動作していますが、厄介なのはエッジ ジェスチャ/ホット コーナー (左、上、右、下) とショートカットです。

記事を読んだことがありますが、何も役に立ちませんでした。人々は登録編集について話しますが、私はこれがうまくいかず、ユーザーは自分のコンピューターを再起動する必要があります。

ゲームを開き、ジェスチャ/ホット コーナーをオフにして、ゲームを閉じたら、ジェスチャ/ホット コーナーを再び利用できるようにする必要があります。

私が達成したいことと同じことをしているいくつかのアプリケーションを見てきました。

これを見つけので、ジェスチャーを検出できます。しかし、それらがアクションであることを無視するにはどうすればよいでしょうか?

ASUS Smart Gesturesも読みましたが、これはタッチパッド用です。

また、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 で Lenovo 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");

これが機能する前に、レジストリを編集して、エクスプローラーを強制終了した後に再起動しないようにする必要がある場合があります。

regeditでに行きます

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

AutoRestartShell を 0 に設定します。

于 2013-03-21T09:13:28.237 に答える
6

(as long as your running off AIR - which it sounds like) You can use AIR 2.0's NativeProcess to execute it.

From there I can think of two solutions:

  1. If there are command line options in Classic Shell, call it from within your AS3 and toggle the gestures on/off through it.

  2. Write a C++ application that toggles the gestures on/off manually.

If you can get that example working in C++, add a bit to the C++ to handle a on/off command line argument and call the C++ exe on initialization and exit of your AS3 application to toggle.

I don't have C++ installed here (at work), but it looks like that C++ function just requires the window handle of your application (hWnd). This tutorial should get you compiled and running, but the window handle you see there will be for the C++ application's window.

Accessing the flash window's handle will be slightly more difficult:

Either way you'll need to use the Process name or ID to identify it as your AS3 process.

This solution also depends on your ability to install things other than the AIR app on the client PC. (ie .NET runtimes, C++ runtimes, Classic Shell installer)

于 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

次に、以下の行は my 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 に答える