powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Глобальный хук WH_CALLWNDPROCRET
4 сообщений из 4, страница 1 из 1
Глобальный хук WH_CALLWNDPROCRET
    #38446855
FatherSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хочу на шарпе отлавилвать события типа wm_initdialog и setfocus от вообще всех окон. Соответственно для этого нужно создать глобальный хук. Ознакомившись со справкой и дополнительно найдя пример пришел к выводу что код установки глобального хука таков:
Код: c#
1.
hook = SetWindowsHookEx(WH_CALLWNDPROCRET, callback, IntPtr.Zero, IntPtr.Zero);


то есть 2 последных параметра нули что говорит что
1. хук расположен в этом самом процессе
2. нужен глобальный хук.

При вызове этого кода возвращает 0 то есть хэндла хука нет. getlasterror возвращает 0.
Если задаю последним параметром id треда моего приложения то хук устанавливается (но это локальный хук на тред а нужен глобальный).
Кто в курсе?
...
Рейтинг: 0 / 0
Глобальный хук WH_CALLWNDPROCRET
    #38447050
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FatherSql,

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

Из управляемого кода лучше использовать WinEvents, SetWinEventHook, etc.
...
Рейтинг: 0 / 0
Глобальный хук WH_CALLWNDPROCRET
    #38447073
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FatherSql,

глобальный для мыща

Код: c#
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.
// install Mouse hook only if it is not installed and must be installed
            if (hMouseHook == 0 && InstallMouseHook)
            {
                // Create an instance of HookProc.
                MouseHookProcedure = new HookProc(MouseHookProc);
                //install hook
                hMouseHook = SetWindowsHookEx(
                    WH_MOUSE_LL,
                    MouseHookProcedure,
                    Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),         0);
                    //    IntPtr.Zero, AppDomain.GetCurrentThreadId());  //<== это помоему для локального случая
                //If SetWindowsHookEx fails.
                if (hMouseHook == 0)
                {
                    //Returns the error code returned by the last unmanaged function called using platform invoke that has the DllImportAttribute.SetLastError flag set. 
                    int errorCode = Marshal.GetLastWin32Error();
                    //do cleanup
                    Stop(true, false, false);
                    //Initializes and throws a new instance of the Win32Exception class with the specified error. 
                    throw new Win32Exception(errorCode);
                }
            }
 public void Stop(bool UninstallMouseHook, bool UninstallKeyboardHook, bool ThrowExceptions)
        {
            //if mouse hook set and must be uninstalled
            if (hMouseHook != 0 && UninstallMouseHook)
            {
                //uninstall hook
                int retMouse = UnhookWindowsHookEx(hMouseHook);
                //reset invalid handle
                hMouseHook = 0;
                //if failed and exception must be thrown
                if (retMouse == 0 && ThrowExceptions)
                {
                    //Returns the error code returned by the last unmanaged function called using platform invoke that has the DllImportAttribute.SetLastError flag set. 
                    int errorCode = Marshal.GetLastWin32Error();
                    //Initializes and throws a new instance of the Win32Exception class with the specified error. 
                    throw new Win32Exception(errorCode);
                }
            }
         }



хук надо снимать , даж если оно не встало.
...
Рейтинг: 0 / 0
Глобальный хук WH_CALLWNDPROCRET
    #38447446
FatherSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvikFatherSql,

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

Из управляемого кода лучше использовать WinEvents, SetWinEventHook, etc.
супер, почему то сколько искал (еще раньше проблема была) на SetWinEventHook не натыкался. А оказалось все довольно просто без геморроя. По крайней мере пока не нашел геморроя дальше еще буду делать может что окажется.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Глобальный хук WH_CALLWNDPROCRET
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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