Questo articolo è un articolo speculare di traduzione automatica, clicca qui per saltare all'articolo originale.

Vista: 17250|Risposta: 0

[Consigli] Uso delle funzioni hook nelle competenze di programmazione C# - SetWindowsHookEx

[Copiato link]
Pubblicato su 07/02/2019 21:12:59 | | |
Come sapete: C# è un linguaggio compagno della piattaforma .NET Framework, e non è possibile implementare hook globali con librerie e disposizioni di compilatore proprie. Ma in pratica le chiamate al codice non gestito valgono in C#, usando la proprietà DllImport per fare riferimento ai metodi nella libreria di codice non gestita. Le funzioni hook esistono in user32.dll, e il prototipo di funzione è il seguente:

HHOOK WINAPI SetWindowsHookEx(

__in int idHook,

__in HOOKPROC lpfn,

__in HINSTANCE hMod,

__in DWORD dwThreadId);

Può essere usato per registrare un tipo specifico di metodo di intercettazione dei messaggi con il sistema operativo (Windows), ad esempio possiamo registrare un hook per bloccare i messaggi globali della tastiera, così che tutti gli eventi di pressione e sollevamento della tastiera possano essere percepiti ed elaborati da noi (non è escluso che esista un hook front-end per inserire il messaggio).

Possiamo fare riferimento a questa funzione in C# dichiarandola così:

  [DllImport("user32.dll")]
        public static extern int SetWindowsHookEx(
            HookType idHook,
            HookProc lpfn,
            IstPtr hInstance,
            int threadId
            );

Vale la pena menzionare che HookType e HookProc sopra sono i miei tipi personalizzati, il che non è importante (perché il programma invia un indirizzo di memoria durante l'esecuzione), ma deve soddisfare determinate specifiche.

I parametri della funzione dall'alto verso il basso sono:

  tipo idHook, che qui è rappresentato da un enum sagomato
     Funzione di callback LPFN quando entrano in gioco i ganci
     handle del modulo hInstance dell'istanza applicativa (di solito il handle del modulo dell'istanza applicativa dove si trova la funzione di richiamo del tuo hook)
       threadIdL'identificatore del thread associato alla sottoroutine hook installata

Esistono diversi tipi di ganci:
Generalmente usiamo 13 per bloccare i messaggi da tastiera e 14 per bloccare quelli del mouse.

La dichiarazione della funzione callback Dobbiamo usare delegati in C#, e la dichiarazione è la seguente:
    delegato pubblico int HookProc(int nCode, int wParam, IntPtr lParam);

Il parametro top-down significa che il parametro restituito dalla catena di hook nCode, 0 significa che questo messaggio (dal precedente hook) viene scartato, e non-0 significa che questo messaggio continua a essere valido

Parametri del messaggio wParam

Parametro del messaggio lParam

Vale la pena menzionare che wParam e lParam sono tipi diversi di messaggi differenti, ma i tipi di wParam possono essere rappresentati approssimativamente dalla seguente enumerazione:
L'iParam è generalmente racchiuso come una struttura, che varia a seconda del tipo di messaggio; le seguenti due strutture sono la struttura lParam dei messaggi di mouse e tastiera:
Quando comprendiamo le informazioni sopra, abbiamo una comprensione di base dell'implementazione in C# delle funzioni hook, e poi prestiamo attenzione a alcune domande:

1. I hook richiedono molte risorse e dovrebbero essere annullati in tempo quando non sono in uso, il che richiede l'uso della funzione UnhookWindowsHookEx

2. Per cortesia, l'amo dovrebbe restituire il risultato di elaborazione del gancio successivo, non quello dell'aggancio corrente solo (usa CallNextHookEx per chiamare il gancio successivo, dato che l'amo viene impostato per primo e poi prende effetto, quindi dovrebbe essere fatto per garantire la normale consegna della catena di ganci).

3. L'hInstance nel parametro della funzione hook è solo dove si trova la funzione callback dell'hook corrente, e deve essere fornito l'indirizzo corretto

4. Poiché viene utilizzato il delegato, dovrebbe essere garantito che l'indirizzo di memoria del delegato (riferimento al metodo) non venga usato come spazzatura, altrimenti ci sarà un'eccezione quando l'hook viene eseguito



Puoi scaricare il programma di esempio che ho scritto, ma il mio programma richiede i seguenti punti principali:

1. Ho bloccato l'implementazione dei hook, aprendo solo l'intercettazione dei messaggi e l'elaborazione di tastiera e mouse (il metodo di utilizzo è lo stesso degli eventi WinForm di mouse e tastiera di C#), e puoi aprirne altri

2. Ho progettato il gancio in modalità singleton, puoi annullarlo

3. A causa di certe intrusioni nel sistema operativo, il software antivirus può essere segnalato come rischioso

4. Il codice è scritto male, puoi semplicemente arrangiarti......



Infine, la differenza tra tecnologia di programmazione e linguaggio è che i loro compilatori e i loro utenti sono diversi, chi usa C non può essere detto superiore a chi usa Java, e la tecnologia non si riflette necessariamente in puntatori, matrici, strutture dati, purché chi comprende i principi informatici, i principi di compilazione, i principi del sistema operativo, ecc. Naturalmente, è positivo che ognuno abbia il proprio linguaggio preferito e i metodi di programmazione abituali.





Precedente:Implementazione pura di hook C#
Prossimo:【Jiangshi WeChat Multi-Open】WeChat Codice Scansione Accesso Opzionale|Multi-Open Illimitato|Salva Configurazione di Login
Disconoscimento:
Tutto il software, i materiali di programmazione o gli articoli pubblicati dalla Code Farmer Network sono destinati esclusivamente all'apprendimento e alla ricerca; I contenuti sopra elencati non devono essere utilizzati per scopi commerciali o illegali, altrimenti gli utenti dovranno sostenere tutte le conseguenze. Le informazioni su questo sito provengono da Internet, e le controversie sul copyright non hanno nulla a che fare con questo sito. Devi eliminare completamente i contenuti sopra elencati dal tuo computer entro 24 ore dal download. Se ti piace il programma, ti preghiamo di supportare software autentico, acquistare la registrazione e ottenere servizi autentici migliori. In caso di violazione, vi preghiamo di contattarci via email.

Mail To:help@itsvse.com