Cara menetapkan Windows hook di Visual C#.NET

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 318804 - Melihat produk di mana artikel ini berlaku.
Untuk versi Microsoft Visual Basic pada artikel ini, lihat 319524.
Perbesar semua | Perkecil semua

Pada Halaman ini

Pendahuluan

Artikel ini menjelaskan cara menetapkan kail yang khusus untuk benang dan kait prosedur dengan menggunakan kait mouse sebagai contoh. Anda dapat menggunakan kait untuk memantau peristiwa jenis tertentu. Anda dapat mengaitkan kejadian ini dengan benang tertentu atau dengan semua thread dalam desktop sama sebagai benang panggilan.

INFORMASI LEBIH LANJUT

Mengatur mouse hook

Untuk mengatur hook, panggilan SetWindowsHookEx fungsi dari User32.dll file. Fungsi ini menginstal aplikasi kait prosedur dalam rantai kait yang berhubungan dengan kait.

Untuk mengatur mouse hook dan untuk memantau peristiwa mouse, ikuti langkah berikut:
  1. Mulai Microsoft Visual Studio.NET.
  2. Pada Berkas menu, titik Baru, lalu klik Project.
  3. Dalam Proyek baru kotak dialog, klik Visual C# proyek di bawah Jenis proyek, lalu klik Aplikasi Windows di bawah Pola acu. Dalam Nama kotak, jenis ThreadSpecificMouseHook. Secara default, suatu bentuk yang dinamakan Form1 dibuat.
  4. Menambahkan baris kode berikut dalam Form1.cs file setelah yang lain menggunakan pernyataan.
    using System.Runtime.InteropServices;
  5. Menambahkan kode di berikut Form1 kelas.
    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. Tambahkan Tombol kontrol ke formulir, dan kemudian tambahkan kode berikut dalam Button1_click prosedur.
    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. Tambahkan kode berikut untuk MouseHookProc fungsi Form1 kelas.
    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. Tekan F5 untuk menjalankan projek. Klik tombol pada formulir untuk mengatur pengait. Koordinat tikus muncul pada bilah keterangan bentuk ketika pointer yang bergerak pada formulir. Klik tombol itu lagi untuk menghapus hook.

Kait global tidak didukung di.NET Framework

Kecuali untuk hook tingkat rendah WH_KEYBOARD_LL dan WH_MOUSE_LL kait tingkat rendah, Anda tidak dapat menerapkan global kait di Microsoft.NET Framework. Untuk menginstal kait global, kait harus asli DLL ekspor untuk menyuntikkan dirinya sendiri dalam proses lain yang membutuhkan fungsi berlaku, konsisten untuk memanggil ke dalam. Perilaku ini memerlukan ekspor DLL. The.NET Framework tidak mendukung DLL ekspor. Mengelola kode memiliki konsep tidak ada nilai yang konsisten untuk pointer fungsi karena petunjuk fungsi ini proxy yang dibangun secara dinamis.

Tingkat rendah kait prosedur disebut pada benang yang diinstal hook. Tingkat rendah kait tidak memerlukan hook prosedur diimplementasikan dalam DLL.

REFERENSI

Untuk informasi lebih lanjut tentang kait, kunjungi Web site Microsoft Developer Network (MSDN) berikut:
.aspx http://MSDN.Microsoft.com/en-us/library/ms632589 (VS.85)

Properti

ID Artikel: 318804 - Kajian Terakhir: 24 September 2011 - Revisi: 2.0
Berlaku bagi:
  • 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
Kata kunci: 
kbhowtomaster kbmt KB318804 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:318804

Berikan Masukan

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com