#include "afx.h"
#include "stdafx.h"
#include "hklib.h"
#include <TCHAR.H >
#pragma data_seg(".OLEG")
HHOOK MyHook = NULL;
#pragma data_seg()
#pragma comment(linker, "/section:.OLEG,rws")
HINSTANCE hinstDLL;
#ifdef _MANAGED
#pragma managed(push, off)
#endif
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call){
case DLL_PROCESS_ATTACH:
hinstDLL = hModule;
return TRUE;
}
return TRUE;
}
HookEXPORT BOOL SetOOMaximizeHook(void)
{
MyHook = SetWindowsHookEx(WH_CBT,(HOOKPROC)OOMaximizeHook,hinstDLL,0);
if(MyHook != NULL)
{ /* success */
return TRUE;
} /* success */
return FALSE;
}; // SetMyHook
HookEXPORT BOOL ClearOOMaximizeHook(void)
{
BOOL unhooked = UnhookWindowsHookEx(MyHook);
return unhooked;
};
LRESULT CALLBACK OOMaximizeHook(int nCode, WPARAM wParam, LPARAM lParam)
{
TCHAR NameOfClass[255] = {0};
if (nCode==HCBT_MINMAX && lParam==SW_MAXIMIZE){
GetClassName(HWND(wParam), NameOfClass, 255);
if(_tcsstr(NameOfClass, _T("SALFRAME")) != NULL){
MoveWindow(HWND(wParam), 200,200,200,200,1);
}
};
// Pass the message on to the next hook
return CallNextHookEx(MyHook, nCode,
wParam, lParam);
};
#ifdef _MANAGED
#pragma managed(pop)
#endif
не работает глрбальный хук
Столкнулся вот с такой непонятной проблемой: есть hklib.dll устанавливающая глобальный хук, есть приложение oometapanel.exe которое устанавливает хук через ДЛЛ. Но сам хук срабатывает только для oometapanel.exe (ставил брекпоинт на OOMaximizeHook), хотя создан по всем правилам глобального хука, и по идее должен ловить сообщения от всех приложений. Перерыл кучу информации, но в чём загвоздка не нашел.
Привожу код:
hklib.cpp - модуль ДЛЛки
Код:
hklib.h - заголовок ДЛЛки
Код:
#define HookEXPORT extern "C" __declspec(dllexport)
HookEXPORT BOOL SetOOMaximizeHook(void);
HookEXPORT BOOL ClearOOMaximizeHook(void);
LRESULT CALLBACK OOMaximizeHook(int nCode, WPARAM wParam, LPARAM lParam);
HookEXPORT BOOL SetOOMaximizeHook(void);
HookEXPORT BOOL ClearOOMaximizeHook(void);
LRESULT CALLBACK OOMaximizeHook(int nCode, WPARAM wParam, LPARAM lParam);
metapanel.cpp - главный модуль приложения
Код:
#pragma once
#include "stdafx.h"
#include "Form1.h"
#include <windows.h>
[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
typedef bool (SetOOMaximizeHook)(void);
typedef bool (ClearOOMaximizeHook)(void);
SetOOMaximizeHook* pSetOOMaximizeHook;
ClearOOMaximizeHook* pClearOOMaximizeHook;
HINSTANCE hinstDLL;
LPCSTR FuncName;
DWORD Err;
bool result;
// Enabling Windows XP visual effects before any controls are created
//Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
hinstDLL = ::LoadLibrary(_T("hklib.dll"));
FuncName = "SetOOMaximizeHook";
pSetOOMaximizeHook = (SetOOMaximizeHook*)::GetProcAddress((HMODULE)hinstDLL, FuncName);
Err = GetLastError();
if (pSetOOMaximizeHook)
result = (*pSetOOMaximizeHook)();
if (result)Debug::Print("Hook installed");
else Debug::Print("Hook install failed");
// Create the main window and run it
Application::Run(gcnew Form1());
FuncName = "ClearOOMaximizeHook";
pClearOOMaximizeHook = (ClearOOMaximizeHook*)::GetProcAddress((HMODULE)hinstDLL, FuncName);
Err = GetLastError();
if (pClearOOMaximizeHook)
result = (*pClearOOMaximizeHook)();
::FreeLibrary(hinstDLL);
if (result) Debug::Print("Hook uninstalled");
else Debug::Print("Hook uninstall failed");
return 0;
}
#include "stdafx.h"
#include "Form1.h"
#include <windows.h>
[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
typedef bool (SetOOMaximizeHook)(void);
typedef bool (ClearOOMaximizeHook)(void);
SetOOMaximizeHook* pSetOOMaximizeHook;
ClearOOMaximizeHook* pClearOOMaximizeHook;
HINSTANCE hinstDLL;
LPCSTR FuncName;
DWORD Err;
bool result;
// Enabling Windows XP visual effects before any controls are created
//Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
hinstDLL = ::LoadLibrary(_T("hklib.dll"));
FuncName = "SetOOMaximizeHook";
pSetOOMaximizeHook = (SetOOMaximizeHook*)::GetProcAddress((HMODULE)hinstDLL, FuncName);
Err = GetLastError();
if (pSetOOMaximizeHook)
result = (*pSetOOMaximizeHook)();
if (result)Debug::Print("Hook installed");
else Debug::Print("Hook install failed");
// Create the main window and run it
Application::Run(gcnew Form1());
FuncName = "ClearOOMaximizeHook";
pClearOOMaximizeHook = (ClearOOMaximizeHook*)::GetProcAddress((HMODULE)hinstDLL, FuncName);
Err = GetLastError();
if (pClearOOMaximizeHook)
result = (*pClearOOMaximizeHook)();
::FreeLibrary(hinstDLL);
if (result) Debug::Print("Hook uninstalled");
else Debug::Print("Hook uninstall failed");
return 0;
}
Суть кода - при развертывании окна приложений OprnOffice.org менять их размер.
Прогу в архив и на сервер, если она, конечно, не содержит особенных секретов.
А то что сий процесс не отлавливался в дебагере - оно и понятно - ведь для других придожений подгружался свой инстанс библиотеки, на который дебагер небыл "натравлен".