Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
15/02/11 12:05
ferruccio94
Chi può dirmi come rilevare la pressione del tasto stamp ed eseguire un codice quando il programma è in background (ad esempio quando il programma è avviato ma sto giocando...)
aaa
15/02/11 13:18
Dedalux
Se la finestra ha il focus è semplice.
Ma nel tuo caso l'unica cosa che mi viene in mente è creare un hook per la tastiera.

Edit: se hai bisogno è una cosa che ho già fatto.
Ultima modifica effettuata da Dedalux 15/02/11 14:06
aaa
15/02/11 14:56
walker93
Suggerisco di usare la funzione "GetAsincKeyState" che funziona sempre anche quando la tua applicazione è in background.

Inseriscila in un timer in questo modo ad ogni Tick controlli se è premuto.
Es.
Dichiarazione:
Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

Uso:
    If GetAsyncKeyState(Keys.PrintScreen) <> 0 Then
      msgbox "Tasto premuto"
    End If
aaa
15/02/11 15:08
Dedalux
Il GetAsyncKeyState non sapevo funzionasse anche in background, e in effetti non avevo mai provato.

Comunque se volessi intercettare il messaggio dalla tastiera prima che giunga all'applicazione serve un hook, mentre, correggimi se dico una cagata, mi pare che il GetAsync rilevi il messaggio dopo che è stato processato.
aaa
15/02/11 15:51
walker93
Non so se viene rilevato prima o dopo...
Sinceramente per l'utilizzo che ne ho fatto io, non mi si è mai posto tale problema...
aaa
15/02/11 15:52
ferruccio94
Postato originariamente da walker93:

Suggerisco di usare la funzione "GetAsincKeyState" che funziona sempre anche quando la tua applicazione è in background.

Inseriscila in un timer in questo modo ad ogni Tick controlli se è premuto.
Es.
Dichiarazione:
Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

Uso:
    If GetAsyncKeyState(Keys.PrintScreen) <> 0 Then
      msgbox "Tasto premuto"
    End If


Ho provato questo codice, ma appena va in debug restituisce questo:

Una chiamata alla funzione PInvoke 'ScreenCaptureAndSave!ScreenCaptureAndSave.Form1::GetAsyncKeyState' ha sbilanciato lo stack. Questo problema può verificarsi quando la firma PInvoke gestita non corrisponde alla firma di destinazione non gestita. Verificare che la convenzione di chiamata e i parametri della firma PInvoke corrispondano alla firma di destinazione non gestita.

Come risolvere...
aaa
15/02/11 16:14
walker93
Semplice cambia la dichiarazione da come è adesso:
Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer


a questa:
Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Integer) As Integer

è cambiata la dichiarazione di vKey. Sarebbe stata Long con vb6...
aaa
16/02/11 16:35
ferruccio94
Grazie, adesso va bene.
aaa