Fórum Variável em DLL #334784

15/12/2006

0

Pessoal,
para monitorar o menu de um determinado aplicativo eu criei uma DLL para instalção do gancho(hook).
Ocorre que a variável declarada para armazenar o handle da janela sendo monitorada, após sua atribuição, perde o valor mantendo aquele que foi atribuído em sua inicialização.
Este é parte do código:
const
  MENU_ITEM_ID = $999;

type
  PMSG = ^TMSG;

var
  WndProg :HWND = 1;   // *** Esta é a variável
  WndOwner :HWND;
  HWndHook :HHook;
  Buffer :array[0..128] of char;

function SysMsgProc(Code: Integer; wParam: Word; lParam: Longint): LongInt; stdcall;
var
  PWndMSG :PMSG;
begin
  if Code = MSGF_MENU then  // outro processo que não o atual
  begin
    PWndMSG := PMSG(lParam);
    MessageBox(0, PChar(Format(´Testando hook: hWnd ¬d, Wnd ¬d´, [PWndMSG^.hWnd, WndProg])), ´Teste´, MB_OK);
    if PWndMSG^.hWnd = WndProg then
    begin
      if (PWndMSG^.message = WM_MENUSELECT) then
      begin
        if LOWORD(PWndMSG^.wParam) = MENU_ITEM_ID then
        begin
          MessageBox(0, ´Meu item acionado´, ´Teste´, MB_OK);
          Exit;
        end else
          MessageBox(0, ´Outro item acionado´, ´Teste´, MB_OK);
      end;
    end;
  end;
  Result := CallNextHookEx(HWndHook, code, wParam, lParam);  // Passa evento para outros ganchos
end;

function InstallWndHook(var aWndOwner, aWnd :HWND): LongInt; stdcall;
begin
  WndOwner := aWndOwner;
  WndProg := aWnd;
  MessageBox(0, PChar(Format(´Testando hook: Wnd ¬d´, [WndProg])), ´Teste´, MB_OK);
  HWndHook := SetWindowsHookEx(WH_SYSMSGFILTER, @SysMsgProc, hInstance, 0);
  if HWndHook = 0 then
    Result := GetLastError
  else
    Result := 0;
end;

Ocorre que o MessageBox em InstallWndHook mostra a mensagem com o valor da variável igual ao atribuido a ela (handle da janela). Entretanto, o MessageBox em SysMsgProc mostra o valor correspondente ao de sua inicialização (1).

Alguém saberia me ajudar ou explicar o que está ocorrendo?

obs:
- Ocorre com hook em outros eventos: WH_COMMAND ou WH_SYSCOMMAND;
- Já tentei adicionando ShareMem;

Grato pela atenção.


Micheus

Micheus

Responder

Posts

28/12/2006

Raczy

Deve ser algum problema com gerenciamento de memória, acho que essa variável não pode ser declarada como global. Isso também acontecia comigo quando eu usava uma dll com um ponteiro, na primeira vez funcionava, depois ele perdia o valor.


Responder

Gostei + 0

01/01/2007

Micheus

É que na primeira vez é carregada na instância do seu programa. Depois, para cada aplicação, a DLL é carregada naquela instância. Então não dá para trabalhar desta forma.
Depois que descobri um tal de FileMapping, fiz uma busca e fui justamente cair num artigo aqui do forum que explica como compartilhar a informação da DLL com minha aplicação - [url=http://forum.devmedia.com.br/viewtopic.php?t=78248&sid=3e1d3e52295ef8fbb873131b598bb6a0]Usando Hook Procedure p/ capturar teclas digitadas no window[/url]

Obrigado.


Responder

Gostei + 0

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

Aceitar