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
  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;
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 ?


Ipc$

Ipc$

Responder

Posts

14/05/2007

Ipc$

Uma correção:
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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar