WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Подкласс окна..

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Подкласс окна..
turbo опубликован 11-04-2001 00:48 MSK   Click Here to See the Profile for turbo   Click Here to Email turbo  
Столкнулся с проблемой..
Создать подклас окна
созданного другим процессом..

Flex Ferrum опубликован 11-04-2001 10:24 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Хм... Делаешь следующим образом (сабклассинг десктопного окна):

HINSTANCE hInst;

HHOOK hCWPRHook;
HWND hExplWnd;
HWND hListWnd;
WNDPROC OldWndProc = NULL;


LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
LRESULT RetVal = 0;

switch(uMsg)
{
// Обработчики различных сообщений
case WM_HOOK_DONE: // Обработчик сообщения о деинсталяции хука
SetWindowLong(hWnd,GWL_WNDPROC,(LONG)OldWndProc);
return 0;
default:
RetVal = CallWindowProc(OldWndProc,hWnd,uMsg,wParam,lParam);
}

return RetVal;
}

HWND FindDesktopWindow()
{
HWND hWnd = FindWindowEx(NULL,NULL,"Progman",NULL);
hWnd = FindWindowEx(hWnd,NULL,"SHELLDLL_DefView",NULL);

return hWnd;
}

void InstallWndProc()
{
HWND hWnd = FindDesktopWindow();

OldWndProc = (WNDPROC)GetWindowLong(hWnd,GWL_WNDPROC);
SetWindowLong(hWnd,GWL_WNDPROC,(LONG)WndProc);
hExplWnd = hWnd;
}

LRESULT CALLBACK CWPRHookProc(int Code,WPARAM wParam,LPARAM lParam)
{
CWPRETSTRUCT * RetStruct = (CWPRETSTRUCT *)lParam;

if(!OldWndProc)
InstallWndProc();

CallNextHookEx(hCWPRHook,Code,wParam,lParam);
}

void InstallHook()
{
HWND hWnd = FindDesktopWindow();
OldWndProc = (WNDPROC)GetWindowLong(hWnd,GWL_WNDPROC);
hExplWnd = hWnd;

DWORD hThread = GetWindowThreadProcessId(hWnd,NULL);

hCWPRHook = SetWindowsHookEx(WH_CALLWNDPROCRET,CWPRHookProc,hInst,hThread);
}

void UnInstallHook()
{
SendMessage(hExplWnd,WM_HOOK_DONE,0,0);
UnhookWindowsHookEx(hCWPRHook);
}

int __export __stdcall DllEntryPoint(HINSTANCE _hInst,DWORD Reason,void *)
{
hInst = _hInst;

switch(Reason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}

return 1;
}

Естественно, что этот код должен лежать в dll. Вроде работало.

turbo опубликован 11-04-2001 14:32 MSK     Click Here to See the Profile for turbo  Click Here to Email turbo     
спасибо //я разобрался...;)

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.