วิธีการตั้งค่า hook ของบันทึกของ Windows ใน Visual .NET c#

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 318804 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
สำหรับรุ่น Microsoft Visual Basic ของบทความนี้ ดู319524.
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

บทนำ

บทความนี้อธิบายวิธีการตั้งค่า hook ของบันทึกที่อยู่เฉพาะ กับเธรด และขั้นตอนของ hook แบบ โดยใช้ hook ของเมาส์ที่เป็นตัวอย่าง คุณสามารถใช้ hooks บางชนิดของเหตุการณ์การตรวจสอบ คุณสามารถเชื่อมโยงเหตุการณ์เหล่านี้ กับเธรดที่ระบุ หรือ กับเธรดทั้งหมดที่อยู่ในเดสก์ท็อปเดียวกันเป็นเธรดที่เรียก

ข้อมูลเพิ่มเติม

การตั้งค่าแบบ hook ของเมาส์

การตั้งค่าของ hook แบบ เรียกการSetWindowsHookExฟังก์ชันจากแฟ้ม User32.dll ฟังก์ชันนี้ติดตั้งมีขั้นตอนของ hook ที่มีกำหนดโปรแกรมประยุกต์ในห่วงโซ่ hook ของบันทึกที่เกี่ยวข้องกับของ hook นี้

การตั้งค่า hook ของเมาส์แบบ และ การตรวจสอบเหตุการณ์ของเมาส์ ทำตามขั้นตอนเหล่านี้:
  1. เริ่ม Microsoft Visual Studio .NET
  2. ในการแฟ้ม:เมนู ให้ชี้ไปที่ใหม่แล้ว คลิกProject.
  3. ในการโครงการใหม่กล่องโต้ตอบ คลิกแสดงโครงการ c#ภายใต้ชนิดโครงการแล้ว คลิกแอพลิเคชันของ windowsภายใต้แม่แบบ. ในการชื่อ:กล่อง ชนิดThreadSpecificMouseHook. โดยค่าเริ่มต้น แบบฟอร์มที่มีชื่อ Form1 ถูกสร้างขึ้น
  4. เพิ่มบรรทัดต่อไปนี้ของรหัสในแฟ้ม Form1.cs หลังจากอื่นการใช้ใบแจ้งยอด
    using System.Runtime.InteropServices;
  5. เพิ่มต่อไปนี้รหัสในนั้น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. เพิ่มคำปุ่มควบคุมไปยังแบบฟอร์ม และจากนั้น เพิ่มโค้ดต่อไปนี้ในการ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. เพิ่มรหัสต่อไปนี้สำหรับการMouseHookProcการทำงานในการ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. กดแป้น F5 เพื่อเรียกใช้โครงการ คลิกที่ปุ่มบนแบบฟอร์มการตั้งค่าของ hook นี้ พิกัดของเมาส์ปรากฏบนแถบคำอธิบายเฉพาะฟอร์มเมื่อตัวชี้แบบเลื่อนบนแบบฟอร์ม คลิกปุ่มอีกครั้งเพื่อเอาของ hook นี้

ไม่มีสนับสนุน hooks ส่วนกลางใน.NET Framework

ยกเว้นสำหรับ WH_KEYBOARD_LL ของ hook ที่ระดับต่ำและ WH_MOUSE_LL ของ hook ที่ระดับต่ำ คุณไม่สามารถใช้งาน hooks ส่วนกลางใน Framework Microsoft .NET การติดตั้ง hook ของบันทึกที่สากล ของ hook แบบต้องมีการส่งออก DLL ท้องถิ่นเพื่อ inject เองในกระบวนการอื่นที่ต้องการฟังก์ชันถูกต้อง สอดคล้องกันเพื่อเรียกเข้า ลักษณะการทำงานนี้ต้องการส่งออกใน DLL .NET Framework ไม่สนับสนุนการ DLL exports รหัสที่ได้รับการจัดการได้ไม่มีแนวคิดของค่าตัวชี้ฟังก์ชันสอดคล้องกันเนื่องจากตัวชี้เหล่านี้ฟังก์ชัน proxies สร้างแบบไดนามิก

มีเรียกขั้นตอนของ hook ระดับต่ำบนเธรดที่ติดตั้ง hook ของบันทึก ระดับต่ำ hooks ไม่ต้องการให้ขั้นตอนของ hook ถูกนำมาใช้ใน DLL

ข้อมูลอ้างอิง

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ hooks แวะไปที่เว็บไซต์ของ Microsoft สำหรับนักพัฒนาเครือข่าย (MSDN) ต่อไปนี้:
.aspx http://msdn.microsoft.com/en-us/library/ms632589 (VS.85)

คุณสมบัติ

หมายเลขบทความ (Article ID): 318804 - รีวิวครั้งสุดท้าย: 13 มกราคม 2554 - Revision: 5.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
Keywords: 
kbhowtomaster kbmt KB318804 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:318804

ให้ข้อเสนอแนะ

 

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