Fórum Subclasseando o explorer #341706
14/05/2007
0
Srs,
Estou fazendo um subclass do explorer para interceptar algumas msgs da systray:
Código na dll:
Instalação da hook
Código na callback:
Código da WindowProc:Ou seja, simplesmente volto a chamar a WindowProc original dele e mesmo assim intermitentemente recebo o famoso erro: Windows Explorer encontrou um erro e precisa ser fechado.
Será que de tempos em tempos ele modifica a WindowProc original ?
E se modificar como se pode saber ?
E se não modificar, o que está errado ?
Estou fazendo um subclass do explorer para interceptar algumas msgs da systray:
Código na dll:
Instalação da hook
HHook_Message := SetWindowsHookEx(WH_GetMessage, @LL_Messsage_Proc, HInstance, 0); // instala a hook HTray := FindWindow(´Shell_TrayWnd´, nil); // pega o handle da bandeja PostMessage(HTray, WM_USer+167, 157, 134); // envia a msg p/ subclassear
Código na callback:
function LL_Messsage_Proc(nCode:Integer; WP:WParam; LP:lParam):Integer; stdcall; var Msg:TMsg; begin CopyMemory(@Msg, Pointer(LP), SizeOf(TMsg)); if (Msg.message = (WM_User+167)) and (Msg.wParam = 157) and (Msg.lParam = 134) then begin HTray := FindWindow(´Shell_TrayWnd´, nil); HProc := SetWindowLong(HTray, GWL_WndProc, DWord(@_Window_Proc_Lock)); // subclassea explorer Exit; end; Result := CallNextHookEx(HHook_Message, nCode, WP, LP); end;
Código da WindowProc:
function _Window_Proc_Lock(h:Thandle; iMsg:UInt; WP:WParam; LP:LParam):Integer; stdcall; begin HTray := FindWindow(´Shell_TrayWnd´, nil); Result := CallWindowProc(Pointer(HProc), HTray, iMsg, WP, LP); // passa a msg p/ outras hooks end;
Será que de tempos em tempos ele modifica a WindowProc original ?
E se modificar como se pode saber ?
E se não modificar, o que está errado ?
Ipc$
Curtir tópico
+ 0
Responder
Posts
14/05/2007
Ipc$
Uma correção:
O comentário: // passa a msg p/ outras hooks
deveria estar na chamada de: CallNextHookEx
O comentário: // passa a msg p/ outras hooks
deveria estar na chamada de: CallNextHookEx
Responder
Gostei + 0
14/05/2007
Ipc$
pessoal, problema resolvido. :)
Estava sub-classeando duas vezes sem retornar a WindowProc original.
Estava sub-classeando duas vezes sem retornar a WindowProc original.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)