Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 17250|Svar: 0

[Tips] Användning av hook-funktioner i C#-programmeringsfärdigheter - SetWindowsHookEx

[Kopiera länk]
Publicerad på 2019-02-07 21:12:59 | | |
Som du vet: C# är ett följeslagarspråk till .NET Framework-plattformen, och det är inte möjligt att implementera globala hooks med egna bibliotek och kompilatorprovisioner. Men i praktiken gäller anrop till ohanterad kod i C#, där egenskapen DllImport används för att referera till metoder i det ohanterade kodbiblioteket. Krokfunktioner finns i user32.dll, och funktionsprototypen är följande:

HHOOK WINAPI SetWindowsHookEx(

__in int idHook,

__in HOOKPROC lpfn,

__in EXEMPEL hMod,

__in DWORD dwThreadId);

Det kan användas för att registrera en specifik typ av meddelandeavlyssningsmetod med operativsystemet (Windows), till exempel kan vi registrera en hook för att blockera globala tangentbordsmeddelanden, så att alla tangentbordstryck- och lyfthändelser kan uppfattas och bearbetas av oss (det utesluts inte att det finns en front-end-hook för att släppa meddelandet).

Vi kan referera till denna funktion i C# genom att deklarera den så här:

  [DllImport("user32.dll")]
        publik statisk extern int SetWindowsHookEx(
            HookType idHook,
            HookProc lpfn,
            IntPtr hInstance,
            int threadId
            );

Det är värt att nämna att HookType och HookProc ovan är mina egna typer, vilket inte är viktigt (eftersom programmet skickar en minnesadress när det körs), men det måste uppfylla vissa specifikationer.

Parametrarna för funktionen från topp till botten är:

  idHook typ, som här representeras av ett format enum
     LPFN-callback-funktionen när hooks kommer in i spel
     hInstance modulhandtag för applikationsinstansen (vanligtvis modulhandtaget för applikationsinstansen där din hook-callback-funktion finns)
       threadIdIdentifieraren för tråden som är kopplad till den installerade hook-subrutinen

Det finns flera typer av krokar:
Vi använder vanligtvis 13 för att blockera tangentbordsmeddelanden och 14 för att blockera musmeddelanden.

Deklarationen av callback-funktionen Vi behöver använda delegater i C#, och deklarationen är följande:
    offentlig delegat int HookProc (int nCode, int wParam, IntPtr lParam);

Top-down-parametern betyder att parametern som skickas tillbaka av nCode-krokkedjan, 0 betyder att detta meddelande (via föregående meddelandekrok) kastas, och icke-0 betyder att detta meddelande fortsätter att vara giltigt

wParam-meddelandeparametrar

lParam-meddelandeparameter

Det är värt att nämna att wParam och lParam är olika typer av olika meddelandetyper, men typerna av wParam kan ungefär representeras med följande uppräkning:
lParam kapslas generellt in som en struktur, vilket varierar beroende på meddelandetyp, följande två strukturer är lParam-strukturen för mus- och tangentbordsmeddelanden:
När vi förstår ovanstående information har vi en grundläggande förståelse för C#-implementeringen av hook-funktioner, och lägger sedan märke till några frågor:

1. Hooks tar upp mycket resurser och bör avbrytas i tid när de inte används, vilket kräver UnhookWindowsHookEx-funktionen

2. Som artighet ska hooken returnera bearbetningsresultatet för nästa hook, inte bara bearbetningsresultatet för den aktuella hooken (använd CallNextHookEx för att anropa nästa hook, eftersom hooken är först och sedan börjar verka, så det bör göras för att säkerställa normal leverans av hookkedjan).

3. HInstansen i hook-funktionsparametern är endast där callback-funktionen för den aktuella hooken finns, och korrekt adress måste anges

4. Eftersom delegaten används bör det säkerställas att delegatens minnesadress (referens till metoden) inte blir förstörd, annars uppstår ett undantag när hooken körs



Du kan ladda ner det exempelprogram jag skrev, men mitt program behöver följande huvudpunkter:

1. Jag blockerade implementeringen av hooks, och öppnade bara meddelandeavlyssning och bearbetning av tangentbord och mus (användningsmetoden är densamma som i C#:s WinForm mus- och tangentbordshändelser), och du kan öppna andra

2. Jag designade kroken för att vara i singleton-läge, du kan avbryta den

3. På grund av vissa intrång i operativsystemet kan antivirusprogram rapporteras som riskfyllt

4. Koden är dåligt skriven, gör det bara med den......



Slutligen är skillnaden mellan programmeringsteknologi och språk att deras kompilatorer och användare är olika, personer som använder C kan inte sägas vara högre än de som använder Java, och teknologin återspeglas inte nödvändigtvis i pekare, matriser, datastrukturer, så länge det gäller personer som förstår datorprinciper, kompileringsprinciper, operativsystemsprinciper osv. Självklart är det bra att alla har sitt eget favoritspråk och vanliga programmeringsmetoder.





Föregående:Ren C#-krokimplementering
Nästa:【Jiangshi WeChat Multi-Open】WeChat Scan Code Valfri inloggning|Obegränsad Multi-Open|Spara inloggningskonfiguration
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com