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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.09.2012, 16:45   #1
VikaR
Пользователь
 
Регистрация: 01.07.2011
Сообщений: 21
Печаль Хук на смену активного окна

В программе нужно определять заголовок активного в данный момент окна, что сейчас реализовано через таймер и GetForegroundWindow. Хотел переделать на перехват сообщения о смене активного окна, нашел два способа, но при реализации столкнулся с проблемами.

1. WH_SHELL и HSHELL_WINDOWACTIVATED

Код:
       ...    
        private const int WH_SHELL = 10;
        private const int WM_WINDOWACTIVATED = 4;    
        public delegate IntPtr HookProc(int nCode, int wParam, IntPtr lParam);
        
        public Hook()
        {
            _ShellProc = new HookProc(ShellHookCallback);
        }
        
        ~Hook()
        {
             UnhookWindowsHookEx(_ShellHookID);
        }
        
        ...
        public IntPtr ShellSetHook()
        {
            using (Process curProcess = Process.GetCurrentProcess())
            using (ProcessModule curModule = curProcess.MainModule)
            {
                return _ShellHookID = SetWindowsHookEx(WH_SHELL, _ShellProc,
                    GetModuleHandle(curModule.ModuleName), 0);
            }
        }
        
        private IntPtr ShellHookCallback(int nCode, int wParam, IntPtr lParam)
        {
            if (nCode >= 0 && nCode == HSHELL_WINDOWACTIVATED)
            {
                    StringBuilder sb = new StringBuilder(300);
                    GetWindowText(wParam, sb, sb.Capacity);
                    //в sb получили заголовок и далее обрабатываем
            }
            return CallNextHookEx(_ShellHookID, nCode, (IntPtr)wParam, lParam);
        }
        ...
Ничего не происходит, как если бы хук не был установлен. Но SetWindowsHookEx возвращает ненулевое значение.

2. WH_CALLWNDPROC и WM_ACTIVATE

Код:
       ...    

        [StructLayout(LayoutKind.Sequential)]
        private struct CWPStruct
        {
            public int lParam;
            public int wParam;
            public int message;
            public int hwnd;
        }
        private const int WH_CALLWNDPROC = 4;
        private const int WM_ACTIVATE = 0x0006;  
        public delegate IntPtr HookProc(int nCode, int wParam, IntPtr lParam);
        
        public Hook()
        {
            _CWPProc = new HookProc(CWPHookCallback);
        }
        
        ~Hook()
        {
             UnhookWindowsHookEx(_CWPHookID);
        }
        
        ...
        public IntPtr CWPSetHook()
        {
            using (Process curProcess = Process.GetCurrentProcess())
            using (ProcessModule curModule = curProcess.MainModule)
            {
                return _CWPHookID = SetWindowsHookEx(WH_SHELL, _CWPProc,
                    GetModuleHandle(curModule.ModuleName), 0);
            }
        }
        
        private IntPtr CWPlHookCallback(int nCode, int wParam, IntPtr lParam)
        {
            if (nCode >= 0)
            {
                 if (wParam == WM_ACTIVATE)
                {
                    CWPStruct cwps = (CWPStruct)Marshal.PtrToStructure(lParam, typeof(CWPStruct));
                    StringBuilder sb = new StringBuilder(300);
                    GetWindowText(cwps.hwnd, sb, sb.Capacity);
                    //обработка 
                }
            }
            return CallNextHookEx(_CWPHookID, nCode, (IntPtr)wParam, lParam);
        }
        ...
В этом случае вообще схлопываются все запущенные оконные приложения и система зависает.

Может, кто сталкивался с этим и знает, в чем проблема?

IDE VS2010, OS Windows XP SP3

Последний раз редактировалось VikaR; 20.09.2012 в 16:48.
VikaR вне форума Ответить с цитированием
Старый 21.09.2012, 10:30   #2
VikaR
Пользователь
 
Регистрация: 01.07.2011
Сообщений: 21
По умолчанию

Нет никаких идей?
VikaR вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скрин активного окна GrabbeR Общие вопросы Delphi 3 21.05.2012 15:28
Как лучше отследить смену активного окна в Windows? Delphi ProstoK Помощь студентам 1 19.04.2012 08:09
определение активного окна DeDoK Общие вопросы Delphi 3 13.12.2010 19:07
Поиск активного окна Arigato Win Api 5 22.11.2008 18:32