Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Событие изменения состава окон в системе

4.7K
16 марта 2006 года
wdk
18 / / 23.02.2004
Народ, требуется отловить событие, если появилось новое окно (зарегистрирован новай хендл) или окно было закрыто, т.е. нужно определить, было ли изменение в наборе хендлов.
Как это сделать?
406
16 марта 2006 года
vitaly2003s
481 / / 27.07.2004
Думаю может помочь хук:
SetWindowsHookEx(WH_SHELL,ShellProc,...

LRESULT CALLBACK ShellProc( int nCode,
WPARAM wParam,
LPARAM lParam
);
Parameters

nCode
[in] Specifies the hook code. If nCode is less than zero, the hook procedure must pass the message to the CallNextHookEx function without further processing and should return the value returned by CallNextHookEx. This parameter can be one of the following values.

HSHELL_WINDOWACTIVATED
The activation has changed to a different top-level, unowned window.
HSHELL_WINDOWCREATED
A top-level, unowned window has been created. The window exists when the system calls this hook.
HSHELL_WINDOWDESTROYED
A top-level, unowned window is about to be destroyed. The window still exists when the system calls this hook.
HSHELL_WINDOWREPLACED
Windows XP: A top-level window is being replaced. The window exists when the system calls this hook.

За остальным в MSDN
4.7K
17 марта 2006 года
wdk
18 / / 23.02.2004
А обязательно выносить этот хук в отдельную dll?
406
17 марта 2006 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by wdk
А обязательно выносить этот хук в отдельную dll?


Ну если это глобальный хук то нужно выносить в отдельную длл. Поэксперементируй. Еще можеш посмотреть хук типа WH_CBT

4.7K
17 марта 2006 года
wdk
18 / / 23.02.2004
Цитата:
Originally posted by vitaly2003s
Ну если это глобальный хук то нужно выносить в отдельную длл. Поэксперементируй. Еще можеш посмотреть хук типа WH_CBT



Пробовал по-разному, ниче нормально не получилось.
Например:
LRESULT CALLBACK CBTProc(int nCode,WPARAM wParam,LPARAM lParam)
{
//пока пусть так
MessageBox(NULL,"hh","hh",MB_OK);
return true;
}

int APIENTRY WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR lpCmdLine,int nCmdShow)
{
..
hook=SetWindowsHookEx(WH_SHELL,ShellProc,NULL,GetCurrentThreadId());
..
}

Может есть нормальный работающий пример?

4.7K
18 марта 2006 года
wdk
18 / / 23.02.2004
Попробовал через dll.
Вот здесь:
hkprcSysMsg = (HOOKPROC)GetProcAddress(hinstDLL, "ShellProc");
адрес получается неправильно, GetLastError дает 127. Почему так?
В dll поцедура:
LRESULT CALLBACK ShellProc(int nCode,WPARAM wParam,LPARAM lParam)
{
MessageBox(NULL,"hh","hh",MB_OK);
return true;
}
406
18 марта 2006 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by wdk
Попробовал через dll.
Вот здесь:
hkprcSysMsg = (HOOKPROC)GetProcAddress(hinstDLL, "ShellProc");
адрес получается неправильно, GetLastError дает 127. Почему так?
}



Да потому что ты походу даже не имееш прелставления о том что используется декорация имен при сборке твоего проекта. Т.е к примеру у тебя есть функция ShellProc,а в исходном файле она будет экспортироваться как _ShellProc@12 или что то подобное.

Попробуй сделать следующее:

Код:
//в проекте экзешника
int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
      //создаем что нить
      .............................

    MYHOOKPROC hkprcSysMsg;
    HMODULE hinstDLL = LoadLibrary((LPCTSTR) "hook.dll");
if(hinstDLL)
    hkprcSysMsg = (MYHOOKPROC)GetProcAddress(hinstDLL, "MySetHook");

    if(hkprcSysMsg)
      hkprcSysMsg(1);

    // Main message loop:
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd,hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }


    if(hkprcSysMsg)
        hkprcSysMsg(0);

    return 0;
}

//Dll проект hookdll

//hookdll.h
#ifdef HOOKDLL_EXPORTS
#define HOOKDLL_API __declspec(dllexport)
#else
#define HOOKDLL_API __declspec(dllimport)
#endif

 extern "C" HOOKDLL_API bool MySetHook(int mode);

//hookdll.cpp

#include "hookdll.h"
HHOOK g_hhok=0;
HANDLE g_Hins=0;

BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        g_Hins=hModule;
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

LRESULT CALLBACK CBTProc(int nCode,WPARAM wParam,LPARAM lParam)
{
    //а  надо так
    if(nCode>0)
    {
        //не советую MesageBox здесь вызывать
    //MessageBox(NULL,"hh","hh",MB_OK);
    }
    //и соответственно в твоем случае всегда необходимо вызывать CallNextHookEx
    return CallNextHookEx(0,nCode,wParam,lParam);
}

HOOKDLL_API bool MySetHook(int mode)
{
    if(mode)
    {
        g_hhok=SetWindowsHookEx(WH_CBT,CBTProc,(HINSTANCE) g_Hins,0);
    }
    else
    {
        if(g_hhok)
            UnhookWindowsHookEx(g_hhok);

    }
    return false;
}
4.7K
18 марта 2006 года
wdk
18 / / 23.02.2004
MYHOOKPROC - не пашет, сделал через PROC, только в функцию ниче не передашь.
Ты писал CallNextHookEx(0,nCode,wParam,lParam), но в большинстве примеров первый параметр ставят HHOOK, это имеет значение? С нулем проще реализовать вариант, когда SetWindowsHookEx находится в программе, а не dll-ке.
4.7K
18 марта 2006 года
wdk
18 / / 23.02.2004
Все получилось! Биг сеньк камраду vitaly2003s за помощь!
Насчет PROC - тупил, надо было писать typedef bool (__cdecl* FUNC1)(HWND). С CALLBACK, как в примере в MSDN, не пашет.
406
18 марта 2006 года
vitaly2003s
481 / / 27.07.2004
Насчет CallNextHookEx и первом ее параметре вот что говорит MSDN:
The CallNextHookEx function passes the hook information to the next hook procedure in the current hook chain. A hook procedure can call this function either before or after processing the hook information.

Syntax

LRESULT CallNextHookEx( HHOOK hhk,
int nCode,
WPARAM wParam,
LPARAM lParam
);
Parameters

hhk
[COLOR=purple]Ignored[/COLOR]
nCode
[in] Specifies the hook code passed to the current hook procedure. The next hook procedure uses this code to determine how to process the hook information.
wParam
[in] Specifies the wParam value passed to the current hook procedure. The meaning of this parameter depends on the type of hook associated with the current hook chain.
lParam
[in] Specifies the lParam value passed to the current hook procedure. The meaning of this parameter depends on the type of hook associated with the current hook chain.
Return Value

Т.е первый парметр данной функции игнорируется и поэтому туда можно писать что угодно ну я пишу туда 0.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог