Globalny hak

0

Witam

Mam problem z założeniem globalnego haka (hook'a) w Delphi, może ktoś z was będzie mógł pomóc.
Z poziomu mojego programu uruchamiam inny program, który w wyniku swojego działania tworzy jakiś plik (w tym momencie nie ważne jaki i do czego jest on mi potrzebny). Muszę znać moment zakończenia działania tego drugiego programu, stąd pomysł założenia globalnego haka i wychwycenia komunikatu WM_CLOSE. Jeśli ktoś jest zainteresowany problemem, <font color="blue">tutaj</font> zamieszczam pełny kod prostego programiku testującego tego haka. Program działa, jednak nie wychwytuje komunikatu.
Przyznaję bez bicia, że w kwestii WinAPI jestem zielony, więc proszę o wyrozumiałość jeśli są tam jakieś oczywiste błędy. Być może istnieje inny sposób osiągnięcia zamierzonego celu, jeśli tak, to jaki?

Pozdrawiam

0

Nie wiem nie sprawdzałem Twojego programu ale aby zamknąć inny program musisz znać jego uchwyt tak więc zrobiłem Ci kodzik na przykładzie notatnika:

procedure TForm1.Timer1Timer(Sender: TObject);
var
H: hWND;
begin
H := FindWindow('notepad',nil);
if h <  WM_DESTROY then
ShowMessage('Notatnik został zamknięty');
end;
0

OK, działa - dzięki!!!
Pisząc mój testowy program kierowałem się "Kompendium programisty" (rozdział: Zakładanie globalnego hooka), przejrzałem większość postów związanych z tym tematem na 4p i doszedłem do wniosku, że ta metoda będzie najbardziej elegancka, jednakże brak elementarnej wiedzy o winAPI uzmysłowił mi, ile jeszcze muszę się nauczyć. Teraz jestem na etapie analizy artykułów umieszczonych na stronach MSDN.
Jeszcze raz dzięki [browar] .

0

Wracam do tematu, ponieważ sposób zaproponowany przez "lankusieka" nie zawsze działa poprawnie, być może dla tego, że ja muszę uruchomić drugi program jako SW_HIDE, oraz z parametrami. Kod który umieszczam poniżej realizuje dokładnie to, o co mi chodziło:

unit uMain1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ShellAPI, ExtCtrls  ;

type

  TForm1 = class(TForm)
    btnStart: TBitBtn;
    memoMsg: TMemo;
    procedure btnStartClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
    function runProcess(ExeFile : PChar) : TProcessInformation;
    procedure waitForProcessEnd(PI : TProcessInformation);

  public
    { Public declarations }
  end;


const exeFile = 'WinAudit.exe /r=gsoPxuTUeERNtnzDaIbMpmidcSArBLF /o=XML /L=pl';


var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
 memoMsg.Lines.Clear;
end;


procedure TForm1.btnStartClick(Sender: TObject);
var PI : TProcessInformation;
begin
  memoMsg.Lines.Clear;
  memoMsg.Lines.Add('Process '+IntTostr(PI.hProcess)+' start ...');
  PI := runProcess(PChar(exeFile));
  memoMsg.Lines.Add('works ...');
  waitForProcessEnd(PI);
  memoMsg.Lines.Add('Process end ...');
end;


function TForm1.runProcess(ExeFile : PChar) : TProcessInformation;
var SI : TStartupInfo;
    PI : TProcessInformation;
begin

 FillChar(SI,sizeof(SI),0);
 FillChar(PI,sizeof(PI),0);

 Result := PI;

 with SI do
 begin
  dwFlags:=STARTF_USESHOWWINDOW;
  wShowWindow:=SW_HIDE;       // SW_SHOW
  cb:=sizeof(TStartupInfo);
 end;

 if CreateProcess(nil,ExeFile,nil,nil,false,NORMAL_PRIORITY_CLASS,nil,nil,SI,PI) then
  Result := PI

end;

procedure TForm1.waitForProcessEnd(PI: TProcessInformation);
begin
  with PI do
    begin
      WaitForInputIdle(hProcess,1000);
      WaitForSingleObject(hProcess,10000);
      WaitForSingleObject(hThread,10000);
      CloseHandle(hProcess);
      CloseHandle(hThread);
    end;
end;

end.

Obeszło się baz zakładania hook'a.

1 użytkowników online, w tym zalogowanych: 0, gości: 1