опубликован 11-04-2001 10:24 MSK
Хм... Делаешь следующим образом (сабклассинг десктопного окна):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. Вроде работало.