PDA

View Full Version : [Java] Catturare eventi di sistema


franksisca
28-11-2007, 23:52
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 ;)

andbin
29-11-2007, 08:12
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)???A quel livello, cioè nella "globalità" del sistema no, non è possibile solo in puro Java.
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.

franksisca
29-11-2007, 08:20
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??

andbin
29-11-2007, 09:13
Ecco un semplice esempio in "C" che inibisce il tasto di INVIO nel sistema.

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

La documentazione riporta alcune informazioni importanti riguardo questi hook "low level" (ce ne sono due, WH_KEYBOARD_LL e WH_MOUSE_LL):

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

franksisca
29-11-2007, 09:30
ok, provo a vedere se ho capito, al massimo ti richiamo (sto pensando di fare tutto il programma in c invece che in java:D

franksisca
29-11-2007, 09:42
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:D

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:mbe: )

per ilresto è tutto molto semplice(sapendo quello che fanno quelli :D ), e mi scuso ancora per la mia niubbagine in materia :D

andbin
29-11-2007, 10:36
io sono "abituato" bene, obvvero quando programmo ho sempre le api di java sotto mouse, epr c/c++ esiste qualcosa di simile???Per le API Win32 c'è MSDN online <qui> (http://msdn.microsoft.com). Può essere lungo e noioso navigare online, quindi consiglio di scaricare (se non ce l'hai già) il Platform SDK <qui> (http://www.microsoft.com/downloads/details.aspx?familyid=0baf2b35-c656-4969-ace8-e4c0c0716adb) che contiene header/librerie e tutta la documentazione per sviluppare su Windows.

HHOOK è un oggetto(o ccosa) che caratteristiche ha???

è un handler particolare????Nella programmazione in Win32 ci sono parecchi handle: handle di finestra, di font, di bitmap, di icona e molti altri.
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.

franksisca
29-11-2007, 11:56
ok, credo di aver capito, se ho problemi vi faccio saperE:D

grazie mille

71104
29-11-2007, 15:46
Poi internamente alle API Win32, questi handle quasi sicuramente sono trattati come dei puntatori a dati o strutture dati specifiche del sistema. quasi sicuramente no invece :D
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