Come impostare un hook di Windows in Visual C# .NET

IMPORTANTE: il presente articolo è stato tradotto tramite un software di traduzione automatica di Microsoft ed eventualmente revisionato dalla community Microsoft tramite la tecnologia CTF (Community Translation Framework) o da un traduttore professionista. Microsoft offre articoli tradotti manualmente e altri tradotti automaticamente e rivisti dalla community con l’obiettivo di consentire all'utente di accedere a tutti gli articoli della Knowledge Base nella propria lingua. Tuttavia, un articolo tradotto automaticamente, anche se rivisto dalla community, non sempre è perfetto. Potrebbe contenere errori di vocabolario, di sintassi o di grammatica. Microsoft declina ogni responsabilità per imprecisioni, errori o danni causati da una traduzione sbagliata o dal relativo utilizzo da parte dei clienti. Microsoft aggiorna frequentemente il software e gli strumenti di traduzione automatica per continuare a migliorare la qualità della traduzione.

Clicca qui per visualizzare la versione originale in inglese dell’articolo: 318804
Per la versione di Microsoft Visual Basic di questo articolo, vedere 319524.
Introduzione
In questo articolo viene descritto come impostare un hook utilizzando l'hook del mouse come un esempio è specifico di un thread e di una routine di hook. È possibile utilizzare gli hook di monitorare determinati tipi di eventi. È possibile associare questi eventi con un thread specifico o con tutti i thread lo stesso desktop come un thread chiamante.
Informazioni

Impostare un hook del mouse

Per impostare un hook, chiamare la funzione SetWindowsHookEx dal file User32. dll. Questa funzione consente di installare una routine di hook definito dall'applicazione della catena di hook associato l'hook.

Per impostare un hook del mouse e per monitorare gli eventi del mouse, attenersi alla seguente procedura:
  1. Avviare Microsoft Visual Studio .NET.
  2. Dal menu File , scegliere Nuovo, quindi progetto.
  3. Nella finestra di dialogo Nuovo progetto scegliere Progetti di Visual C# in Tipi progettoe quindi fare clic su Applicazione Windows in modelli. Nella casella nome , digitare ThreadSpecificMouseHook. Per impostazione predefinita, viene creato un form denominato Form1.
  4. Aggiungere la seguente riga di codice nel file Form1. cs dopo le altre istruzioni using .
    using System.Runtime.InteropServices;
  5. Aggiungere il seguente codice nella classe Form1 .
    public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);//Declare the hook handle as an int.static int hHook = 0;//Declare the mouse hook constant.//For other hook types, you can obtain these values from Winuser.h in the Microsoft SDK.public const int WH_MOUSE = 7;private System.Windows.Forms.Button button1;//Declare MouseHookProcedure as a HookProc type.HookProc MouseHookProcedure;			//Declare the wrapper managed POINT class.[StructLayout(LayoutKind.Sequential)]public class POINT {	public int x;	public int y;}//Declare the wrapper managed MouseHookStruct class.[StructLayout(LayoutKind.Sequential)]public class MouseHookStruct {	public POINT pt;	public int hwnd;	public int wHitTestCode;	public int dwExtraInfo;}//This is the Import for the SetWindowsHookEx function.//Use this function to install a thread-specific hook.[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);//This is the Import for the UnhookWindowsHookEx function.//Call this function to uninstall the hook.[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]public static extern bool UnhookWindowsHookEx(int idHook);		//This is the Import for the CallNextHookEx function.//Use this function to pass the hook information to the next hook procedure in chain.[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);
  6. Aggiungere un controllo Button al form e quindi aggiungere il codice seguente nella routine Button1_click .
    private void button1_Click(object sender, System.EventArgs e){	if(hHook == 0)	{	        // Create an instance of HookProc.		MouseHookProcedure = new HookProc(Form1.MouseHookProc);						hHook = SetWindowsHookEx(WH_MOUSE, 					MouseHookProcedure, 					(IntPtr)0,					AppDomain.GetCurrentThreadId());		//If the SetWindowsHookEx function fails.		if(hHook == 0 )		{			MessageBox.Show("SetWindowsHookEx Failed");			return;		}		button1.Text = "UnHook Windows Hook";	}	else	{		bool ret = UnhookWindowsHookEx(hHook);		//If the UnhookWindowsHookEx function fails.		if(ret == false )		{			MessageBox.Show("UnhookWindowsHookEx Failed");			return;		}		hHook = 0;		button1.Text = "Set Windows Hook";		this.Text = "Mouse Hook";	} }
  7. Aggiungere il seguente codice per la funzione MouseHookProc nella classe Form1 .
    public static int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam){	//Marshall the data from the callback.	MouseHookStruct MyMouseHookStruct = (MouseHookStruct) Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));	if (nCode < 0)	{		return CallNextHookEx(hHook, nCode, wParam, lParam);	}	else	{		//Create a string variable that shows the current mouse coordinates.		String strCaption = "x = " + 				MyMouseHookStruct.pt.x.ToString("d") + 					"  y = " + 		MyMouseHookStruct.pt.y.ToString("d");		//You must get the active form because it is a static function.		Form tempForm = Form.ActiveForm;        		//Set the caption of the form.		tempForm.Text = strCaption;		return CallNextHookEx(hHook, nCode, wParam, lParam); 	}}
  8. Premere F5 per eseguire il progetto. Fare clic sul pulsante sul form per impostare l'hook. Le coordinate del mouse vengono visualizzate sulla barra del titolo del form quando si sposta il puntatore del mouse sul form. Fare clic sul pulsante per rimuovere l'hook.

Hook globali non supportati di.NET Framework

Fatta eccezione per l'hook di basso livello WH_KEYBOARD_LL e l'hook di basso livello WH_MOUSE_LL, non è possibile implementare hook globale di.NET Framework di Microsoft. Per installare un hook globale, un hook deve avere un'esportazione DLL nativa di inserire se stesso in un altro processo che richiede una funzione valida e coerenza per chiamare in. Questo comportamento richiede un'esportazione DLL. Il.NET Framework non supporta le esportazioni DLL. Codice gestito non esiste il concetto di un valore uniforme per un puntatore a funzione, poiché questi puntatori a funzione sono proxy che vengono compilati dinamicamente.

Routine di hook di basso livello vengono chiamati sul thread in cui è installato l'hook. Hook di basso livello non è necessario che la routine di hook deve essere implementato in una DLL.
Riferimenti
Per ulteriori informazioni su hook, visitare il seguente sito Web Microsoft Developer Network (MSDN):

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 318804 - Ultima revisione: 04/07/2016 09:02:00 - Revisione: 4.0

Microsoft .NET Framework 2.0, Microsoft .NET Framework 1.1, Microsoft .NET Framework 1.0, Microsoft Visual C# 2005 Express Edition, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual C# .NET 2002 Standard Edition

  • kbhowtomaster kbmt KB318804 KbMtit
Feedback