Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.07.2013, 08:33   #1
Rishi
Новичок
Джуниор
 
Регистрация: 07.05.2011
Сообщений: 2
По умолчанию SetWindowsHookEx + WH_CALLWNDPROC в C#

Здравствуйте.
Задача стоит следующая - отлавливать событие смены активного окна в системе.
С WinApi и С++ знакома плохо, оттого прошу помощи.
Как я понимаю, для глобального хука нужно в dll вынести функцию, которая срабатывает при его отлове. Но проблема в том, что эта часть (будет) сильно связна с проектом.
В общем, подскажите, что нужно сделать, чтобы это заработало.

PHP код:
[DllImport("user32.dll")]
             static 
extern IntPtr SetWindowsHookEx(int idHookCallWindProc callbackIntPtr hInstanceuint threadId);
             [
DllImport("user32.dll")]
             static 
extern bool UnhookWindowsHookEx(IntPtr hInstance);
             [
DllImport("user32.dll")]
             static 
extern IntPtr CallNextHookEx(IntPtr idHookint nCodeint wParamIntPtr lParam);
             [
DllImport("kernel32.dll")]
             static 
extern IntPtr LoadLibrary(string lpFileName);
             private 
delegate IntPtr CallWindProc(int nCodeIntPtr wParamIntPtr lParam);
CallWindProc _proc = new CallWindProc(hookProc);
             [
DllImport("kernel32.dll"CharSet CharSet.AutoSetLastError true)]
             private static 
extern IntPtr GetModuleHandle(string lpModuleName);
             private static 
IntPtr hhook IntPtr.Zero;
             private const 
int WM_ACTIVATE 6;
             private const 
int WH_CALLWNDPROC 12;
public 
void SetHook()
             {
                 
Int32 hw GetForegroundWindow();
                 
Int32 pid;
                 
                 
UInt32 piid GetWindowThreadProcessId(hwout pid);
                 
IntPtr hInstance LoadLibrary("User32");
                   
using (Process curProcess Process.GetCurrentProcess())
                   
using (ProcessModule curModule curProcess.MainModule)
                   {

                       
hhook SetWindowsHookEx(WH_CALLWNDPROC_procGetModuleHandle(curModule.ModuleName), (UInt32)piid);
                       
//hhook = SetWindowsHookEx(WH_CALLWNDPROC, _proc, hInstance, (UInt32)piid);
                   
}
             }
             public static 
void UnHook()
             {
                 
UnhookWindowsHookEx(hhook);
             }
             public static 
IntPtr hookProc(int codeIntPtr wParamIntPtr lParam)
             {
                 if (
code == (int)WM_ACTIVATE)
                 {

                         
MessageBox.Show("Смена активного окна");
                    
                 }
                     
                     return 
CallNextHookEx(hhookcode, (int)wParamlParam);
             } 
Код компилируется, но на смену окна не реагирует.
Заранее спасибо за помощь.
Rishi вне форума Ответить с цитированием
Старый 06.07.2013, 22:06   #2
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
lParam
[in] Указатель на структуру CWPSTRUCT, которая содержит подробности о сообщении.
i.e. "int code" - несколько другое, чем идентификатор месседжа
Smogg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по SetWindowsHookEx Ga-sergey Visual C++ 9 27.10.2011 11:33
Может ли SetWindowsHookEx(WH_CALLWNDPROC) повесить всю систему? SergeyEfimov Win Api 4 26.02.2011 02:01
SetWindowsHookEx Dalt Win Api 13 25.01.2011 14:03
WH_CALLWNDPROC, расширение Системных часов TGrey[WoLf] Win Api 0 25.06.2010 16:00
Получить ID процесса для setwindowshookex TwiX Общие вопросы Delphi 2 20.05.2010 20:00