|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
[Java] Catturare eventi di sistema
ragazzi, è possibile, tenendo avviato un programma java, sempre in esecuzione, catturare gli eventi che generalmente verrebbero interpretati dal Sistema Operativo (windows) e fargli fare altro???
mi spiego, se premo ctrl+aòt+canc apre il task manager, io invece vorrei che aprisse una mia finestra....oppure, meglio ancora, sarebbe possibile disattivare completamente un tasto (l'alt per esempio)??? grazie per le info ![]()
__________________
My gaming placement |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Si può fare in C/C++ e servono apposite API del sistema (su Windows mi riferisco ad esempio alla funzione SetWindowsHookEx). E sfruttando JNI tecnicamente sarebbe possibile pilotare/gestire la cosa anche da Java.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
ok, ma come???
scusa se sono diretto, ma non saprei nemmeno dove cercare, e considera che in c/c++ non ho mai programmato a livello discreto.....se mi indirizzi o mi fai vedere bene cdove posso trovare qualcosa sulle chiamate native e su come fare lo in c++ mi saresti utile. A questo punto però ti faccio un'altra domanda....io programmo decentemente in java, al prossimo periodo all'0università devo fare programmazione opengl in c++, credi che se facessi questo programma direttametne in c++ mi sarebbe di aiuto?? C++ dovrebbe interfacciarsi meglio con il sistema operativo, giusto??
__________________
My gaming placement |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Ecco un semplice esempio in "C" che inibisce il tasto di INVIO nel sistema.
Codice:
#define STRICT #define _WIN32_WINNT 0x0400 #include <windows.h> #include <stdio.h> HHOOK g_hHook; LRESULT CALLBACK LLKeyProc (int nCode, WPARAM wParam, LPARAM lParam) { PKBDLLHOOKSTRUCT pkdhs = (PKBDLLHOOKSTRUCT) lParam; if (nCode >= 0) { if (wParam == WM_KEYDOWN || wParam == WM_KEYUP) { if (pkdhs->vkCode == VK_RETURN) return 1; } } return CallNextHookEx (g_hHook, nCode, wParam, lParam); } int main (void) { g_hHook = SetWindowsHookEx (WH_KEYBOARD_LL, LLKeyProc, GetModuleHandle (NULL), 0); if (g_hHook != NULL) { MessageBox (NULL, "Hook attivato, premere OK per terminare.", "HOOK TEST", MB_OK); UnhookWindowsHookEx (g_hHook); } else printf ("Errore %lu\n", GetLastError ()); return 0; } - Funzionano solo con Windows NT/2000/XP in poi. - Non è necessario mettere la hook procedure in una DLL, avviene un context switch automatico verso il thread che ha installato l'hook. - La gestione di questi eventi low-level è basata sui messaggi e questo significa che la applicazione deve avere un loop dei messaggi. Il modo più semplice per avere un loop dei messaggi è usare una dialog di message box (ha il loop interno), come ho fatto nel codice sopra.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
ok, provo a vedere se ho capito, al massimo ti richiamo (sto pensando di fare tutto il programma in c invece che in java
![]()
__________________
My gaming placement |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
continuiamo qui per te va bene???
allora, prima cosa: io sono "abituato" bene, obvvero quando programmo ho sempre le api di java sotto mouse, epr c/c++ esiste qualcosa di simile??? poi, partiamo con le domande ![]() HHOOK è un oggetto(o ccosa) che caratteristiche ha??? è un handler particolare???? siccome bene o male non li conosco nessuno, me li pottresti spiegare gli oggetti che hai usato (in c non ci sono oggetti......quindi che sono quelli ![]() per ilresto è tutto molto semplice(sapendo quello che fanno quelli ![]() ![]()
__________________
My gaming placement |
![]() |
![]() |
![]() |
#7 | ||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
Per il programmatore è semplicemente un numero, un valore che viene fornito da funzioni specifiche che li creano e che va passato pari pari ad altre funzioni. Poi internamente alle API Win32, questi handle quasi sicuramente sono trattati come dei puntatori a dati o strutture dati specifiche del sistema. Ma per il programmatore questo in genere è del tutto ininfluente. SetWindowsHookEx fornisce un HHOOK, un handle che identifica l'hook appena creato. Quale è il valore di questo handle non è importante, va solo passato alle altre funzioni quali CallNextHookEx o UnhookWindowsHookEx.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
ok, credo di aver capito, se ho problemi vi faccio saperE
![]() grazie mille
__________________
My gaming placement |
![]() |
![]() |
![]() |
#9 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() hai mai visto che valori hanno, almeno quelli di sistema (cioè quelli di tipo HANDLE o SOCKET o simili)? mi pare che nel libro della Microsoft sugli internals di NT veniva anche descritto il layout di un HANDLE. inoltre se gli handles (stavolta parlando in generale, per qualunque tipo di handle) venissero trattati semplicemente come puntatori a strutture dati interne sarebbe troppo facile creare strutture dati fasulle e passarne i puntatori alle API. ultima osservazione: quando si programma nel kernel c'è una evidente differenza tra HANDLE e puntatore all'oggetto. guarda queste funzioni ad esempio: http://msdn2.microsoft.com/en-us/library/ms802942.aspx http://msdn2.microsoft.com/en-us/library/ms802941.aspx |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:48.