2012-11-20 9 views
13

Ho un gioco AS3 di gioco a schermo intero con Adobe AIR eseguito in Windows 7. In questo gioco potrebbe non essere facile uscire (pensa alla modalità kiosk, esci solo premendo esc e inserisci una password).Disabilitare i gesti dei bordi di Windows 8/hot corner per le applicazioni multi-touch durante l'esecuzione a schermo intero

Ora voglio che questo gioco funzioni in Windows 8. Il gioco funziona come previsto, ma le cose più coinvolgenti sono questi gesti/angoli caldi (a sinistra, in alto, a destra, in basso) e le scorciatoie.

Ho letto articoli ma nessuno mi ha aiutato. Le persone parlano di modifiche al registro, ma non riesco a farlo funzionare + l'utente deve riavviare il suo/il suo computer.

Desidero aprire il mio gioco, disattivare i gesti/hot corner e quando il gioco chiude i gesti/gli hot corner devono tornare nuovamente disponibili.

Ho visto alcune applicazioni fare lo stesso di quello che voglio ottenere.

Ho trovato this così sono in grado di rilevare i gesti. Ma come ignorare sono azioni?

Ho letto anche ASUS Smart Gestures ma questo è per il touch-pad.

E ho provato Classic Shell ma ho bisogno di disattivare i gesti di bordo/hot corner senza tali programmi, solo al volo.

Ho trovato anche this ma non so come implementarlo.

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

Qualcuno sa come posso farlo? Oppure indicarmi la direzione giusta?

Ho provato alcuni in C# e C++, ma non sono un esperto sviluppatore C#/C++. Anche il gioco è realizzato in AS3, quindi sarà difficile implementarlo in C#/C++.

Io lavoro sul Lenovo aio (All in one) con Windows 8.

+0

non è esattamente una risposta, ma è consentito dalle regole dell'interfaccia utente di Windows 8?o è stato realizzato per l'uso al di fuori dello Store? – RoughPlace

+0

Per quanto ne so, questo è consentito per le app a schermo intero/non store. Come dice il documento MSDN "Questa proprietà non ha alcun effetto sulle app di Windows Store.". –

+1

La mia app non sarà disponibile nel negozio. Questo è un gioco che gira attualmente su Windows 7. L'unica differenza in Windows 8 sono questi bordi d'apertura –

risposta

4

sto cercando di fare la stessa cosa. Il C++ sotto disabilita Win8 Gesti sul ogni applicazione/finestra di esecuzione. Come accennato JonoRR, il passo successivo sarebbe essere chiamata solo sul HWND che si desidera raggiungere. Se l'applicazione mirata è chiuso, quindi riaperto, i gesti torneranno.

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

(a patto che il scappare AIR - che suona come) È possibile utilizzare AIR 2.0 NativeProcess per eseguirlo.

Da lì mi vengono in mente due soluzioni:

  1. Se non ci sono opzioni di riga di comando in Classic Shell, lo chiamano da dentro il tuo AS3 e alternare i gesti on/off attraverso di essa.

  2. Scrivere un'applicazione C++ che attiva/disattiva manualmente i movimenti.

Se si può ottenere che esempio di lavoro in C++, aggiungere un po 'per il C++ per gestire un argomento on/off riga di comando e chiamare l'exe C++ su l'inizializzazione e l'uscita della vostra applicazione AS3 per attivare o disattivare.

Non ho installato C++ qui (al lavoro), ma sembra che la funzione C++ richieda solo l'handle della finestra dell'applicazione (hWnd). This tutorial dovrebbe essere compilato e in esecuzione, ma l'handle della finestra si vede che ci sarà per la finestra dell'applicazione C++.

Accesso maniglia della finestra flash sarà un po 'più difficile:

In entrambi i casi è necessario utilizzare il nome del processo o l'ID per identificare come il processo di AS3.

Questa soluzione dipende anche dalla vostra capacità di installare altre cose che l'applicazione AIR sul PC client. (Ovvero .NET tempi di esecuzione, i tempi di esecuzione C++, installazione Classic Shell)

+0

Sarei felice di aiutarmi con il C++ /. NET/Windows, ma non fino a tardi questa sera (alle 15.30 qui) - non crederesti a quante soluzioni personalizzate e hacky come questa dovevamo lavorare quando Stavo lavorando con AS3 e chioschi. – Jono

+1

Grazie per questa risposta utile. Sì, il mio gioco funziona con Adobe Air. Programma CLassic Shell intendi? Se è così non posso aspettarmi che gli utenti lo abbiano installato. Ho provato a creare l'applicazione C++ e ho scaricato il 'Windows Hello World Sample 'ma questo esempio non funziona correttamente in Windows 8. Se incollo il mio pezzo di codice sopra in questo esempio Hello World vedo che' IPropertyStore' doesn' esiste Ho trovato 'IPropertyStorage' ma questa (Interface?) Non contiene' pPropStore-> SetValue' Non ho mai lavorato con C++, che sembra davvero difficile per me. –

7

Sto creando un'applicazione chiosco per Windows 8 utilizzando C#, ho successo disabilitato i gesti magnetiche uccidendo il Process Explorer quando il programma si avvia. Non so come sia fatto in C++ ma in C# è come questo.

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

Durante l'evento di chiusura del mio programma, ho appena riavviato il processo.

Process.Start("explorer.exe"); 

Prima di questo funziona potrebbe essere necessario modificare il registro per evitare esploratore riavvio dopo si uccide.

In regedit andare a

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

Impostare l'AutoRestartShell a 0.

+0

Signore, io sono il mio eroe. Ho utilizzato questo approccio per creare un'app kiosk di successo. Grazie – Matyas

1

La risposta qui sotto si basa su Dovogja's brilliant answer, ma utilizza un file batch per farlo. In questo modo è sufficiente lanciare con un launch.bat

Windows charms bar è gestito da explorer.exe. Quindi, se la vostra applicazione può funzionare senza di essa allora si può incidere intorno ad esso dal primo disabilitando l'autorestart di explorer.exe via (Esegui come amministratore):

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "AutoRestartShell" /t REG_DWORD /d 0 

Poi le linee di seguito rappresentano il mio launch.bat - che funziona alla fine come previsto:

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

Uso l'approccio sopra descritto per consentire l'esecuzione di un'app kiosk senza tastiera. Perché con una tastiera puoi ancora chiudere l'app con alt + f4.

Problemi correlati