Как задать обработчик Windows в Visual C#.NET

ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.

Эта статья на английском языке:318804
Microsoft Visual Basic версии данной статьи см. 319524.
Введение
В данной статье описывается установка ловушки, определенный поток и процедура подключения, используя в качестве примера обработчик мыши. Ловушки можно использовать для отслеживания определенных типах событий. Эти события можно связать с конкретным потоком или все потоки одного рабочего стола, как вызывающий поток.
Дополнительная информация

Установить обработчик мыши

Чтобы задать обработчик вызова SetWindowsHookEx функции из файла User32.dll. Эта функция устанавливает процедуру подключения определяется приложением в цепочке обработчик, связанный с крюком.

Чтобы установить обработчик мыши и наблюдать за событиями мыши, выполните следующие действия.
  1. Запустите Microsoft Visual Studio.NET.
  2. На Файл Выберите пункт Новый, а затем нажмите кнопку Проект.
  3. В Новый проект диалоговое окно, нажмите кнопку Проекты Visual 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 для запуска проекта. Нажмите кнопку на форму, чтобы задать обработчик. При перемещении указателя по форме, координаты мыши отображаются в строке заголовка формы. Нажмите кнопку еще раз, чтобы удалить обработчик.

Глобальные обработчики не поддерживаются.NET Framework

За исключением низкого уровня ловушка WH_KEYBOARD_LL и WH_MOUSE_LL ловушка низкого уровня не может реализовать глобальные обработчики в Microsoft.NET Framework. Для установки глобальный обработчик, обработчик должен быть собственного экспорта DLL ввести себя в другой процесс, который требует допустимое, согласованные функции для вызова. Это требует экспорта библиотеки DLL. .NET Framework поддерживает экспорта библиотеки DLL. Управляемый код не имеют представления согласованные значения для указателя функции из-за этих указателей на функции прокси-серверы, которые создаются динамически.

Ловушка низкого уровня процедуры вызываются в потоке, в котором установлена ловушка. Обработчики низкого уровня не требуется реализовать процедуру подключения в библиотеке DLL.
Ссылки
Для получения дополнительных сведений о ловушки посетите веб-узел Microsoft Developer Network (MSDN):

Свойства

Номер статьи: 318804 — последний просмотр: 06/07/2011 10:27:00 — редакция: 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 KbMtru
Отзывы и предложения