powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Глобальный hook
4 сообщений из 4, страница 1 из 1
Глобальный hook
    #32669750
НЕ СКАЖУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делаю на клавиатуру хук. Устанавливается этот хук из формы. И срабатывает этот хук только для этой формы, и если форма потеряет фокус, то даже после установки фокуса для формы, хук уже не работает.
Помогите его переделать, чтобы хук был глобальным и срабатывал всегда. Или подскажите, что неверно(почему хук работает не как глобальный).

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
 //DLL 
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Hook
{
	public delegate IntPtr HookDelegate(int Code, byte wParam, IntPtr lParam); //Делегат для ф-ий-обработчиков хуковских сообщений 

	public class MessageHooker
	{
		#region Win32 API Imports
		[DllImport("User32.Dll")] public static extern bool UnhookWindowsHookEx(IntPtr HookHandle);
		[DllImport("User32.Dll")] public static extern IntPtr SetWindowsHookEx(int HookId, HookDelegate Delegate, long ModuleHandle, int ThreadId);
		[DllImport("User32.Dll")] public static extern IntPtr CallNextHookEx(IntPtr CurrentHookHandle, int Code, int wParam, int lParam);
		#endregion
        public byte key;
		public event KeyEventHandler KeyPress; //событие, генерится,когда сообщение получено и вызван обработчик 
                 	protected IntPtr KeyboardHook = IntPtr.Zero; //HHOOK 
		protected HookDelegate KeyDelegate;
		public MessageHooker()
		{
			KeyDelegate = new HookDelegate(ProcessKeyHook);
		}

		public void SetHook() //Устанавливаем хук 
		{
			long hModule = System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]).ToInt64();
		KeyboardHook = SetWindowsHookEx(2 /*WH_KEYBOARD*/ , KeyDelegate, hModule, 0);
				}

		public void KeyboardUnHook() //снимаем хук 
		{
			if (KeyboardHook.ToInt32() != 0)
			{
				UnhookWindowsHookEx(KeyboardHook);
				KeyboardHook = IntPtr.Zero;
			}
		}
                     public IntPtr ProcessKeyHook(int Code, byte wParam, IntPtr lParam) //обработчик отлавливаемых сообщений 
		{
			if(Code==0)
			{
				KeyEventArgs kea = new KeyEventArgs((Keys)wParam); //в дальнейшем игнорируем 
				key=wParam; //получаем  нажатый символ 
				KeyPress(this, kea); //генерим событие нажатия клавиши. В дальнейшем обрабатывается exe'шником, устанавливающем хук 
				
			}
			return Code < 0 ? CallNextHookEx(KeyboardHook, Code, wParam, lParam.ToInt32()) : IntPtr.Zero; //если в системе есть еще хуки, то передаем им управление. 
			
		}
	}
}

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
 //EXE 
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using Hook;
 
namespace HookSeter
{
	 /// <summary> 
	 /// Summary description for Form1. 
	 /// </summary> 
	public class Form1 : System.Windows.Forms.Form
	{
		 /// <summary> 
		 /// Required designer variable. 
		 /// </summary> 
		private System.ComponentModel.Container components = null;
        private MessageHooker m_MessageHooker = null;
		public void MessageHooker_KeyPress(object Sender, KeyEventArgs e)
		{
			string s=new string((char)m_MessageHooker.key,1); //Получаем нажатый символ 
			
			MessageBox.Show(s);
			
			
		
			
		}

		public Form1()
		{
			
			InitializeComponent();
			
            m_MessageHooker=new MessageHooker();
			m_MessageHooker.SetHook(); //Ставим хук 
			m_MessageHooker.KeyPress += new KeyEventHandler(MessageHooker_KeyPress); //обрабатываем сообщение нажатия 

        }

		 /// <summary> 
		 /// Clean up any resources being used. 
		 /// </summary> 
		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
                m_MessageHooker.KeyboardUnHook(); //Снимаем хук 
				if (components != null) 
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}

		#region Windows Form Designer generated code
		 /// <summary> 
		 /// Required method for Designer support - do not modify 
		 /// the contents of this method with the code editor. 
		 /// </summary> 
		private void InitializeComponent()
		{
			 //  
			 // Form1 
			 //  
			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
			this.ClientSize = new System.Drawing.Size(292, 266);
			this.Name = "Form1";
			this.Opacity = 0.8;
			this.Text = "Form1";

		}
		#endregion

		 /// <summary> 
		 /// The main entry point for the application. 
		 /// </summary> 
		[STAThread]
		static void Main() 
		{
			Application.Run(new Form1());
		}
	}
}
[SRC c#][/SRC]
...
Рейтинг: 0 / 0
Глобальный hook
    #32669760
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
немного подправь
Код: plaintext
1.
2.
3.
public void SetHook() //Устанавливаем хук 
{ //int hModule = Marshal.GetHINSTANCE(System.Reflection.Assembly.GetAssembly(this.GetType()).GetModules()[0]).ToInt32(); 
  KeyboardHook = SetWindowsHookEx(2 /*WH_KEYBOARD*/ , KeyDelegate, 0, AppDomain.GetCurrentThreadId());
}

и/или посмотри HOW TO: Set a Windows Hook in Visual C# .NET

MSDNGlobal Hook Is Not Supported in .NET Framework
...
Рейтинг: 0 / 0
Глобальный hook
    #32669762
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и, поэтому, для своих приложений лучше использовать
Application.AddMessageFilter();насколько меньше писанИны :)
...
Рейтинг: 0 / 0
Глобальный hook
    #32669968
НЕ СКАЖУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выяснил, что глобальный хук можно поставить средствами .NET, если устанавливать низкоуровневую отловку сообщений(WH_KEYBOARD_LL).
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Глобальный hook
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]