[ krle_zr @ 03.02.2012. 12:33 ] @
Hocu da napravim aplikaciju koja bi belezila nazive aktivnih prozora. Hocu da presretnem Windows poruku kada dodje do promene aktivnog prozora.
Znam da bih mogao isto da uradim i sa Timer komponentom (da okida svakih 5 sekundi i vraca mi naziv aktivnog prozora) ali mi se cini elegantnije ako uhvatim poruku i zatim logujem naziv prozora. Gledao sam poruke WM_ACTIVATE i WM_MOUSEACTIVATE i koristio bih funkciju GetForegroundWindow.

Pozdrav

EDIT: Izvinjavam se ako nisam dovoljno jasan, mislio sam na promenu bilo kojeg prozora u Windows-u. Znaci kada korisnik klikne na drugi prozor, predpostavljam da se salje neka poruka sistemu.

[Ovu poruku je menjao krle_zr dana 03.02.2012. u 13:54 GMT+1]
[ reiser @ 03.02.2012. 14:31 ] @
Otprilike ovako:

Code:

interface

TForm1 = class
...
end;

implementation

var
  formPointer : TForm1;

procedure WinProc(hWinEventHook: THandle; event: DWORD; hwnd: HWND; idObject, idChild: Longint; idEventThread, dwmsEventTime: DWORD); stdcall;
var
  winTitle : Array[0..MAX_PATH - 1] of Char;
begin
  GetWindowText(hwnd, winTitle, MAX_PATH);
  formPointer.Memo.Lines.Add(StrPas(winTitle));
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  hndHook : THandle;
begin
  formPointer := self;
  hndHook := SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, 0, WinProc, 0, 0, WINEVENT_OUTOFCONTEXT);
end;


S' tim sto u callback funkciji ne mozes da pristupas direktno klasi, vec moras da sacuvas pointer ka njoj u nekoj promenljivoj van te klase, u ovom slucaju formPointer.
[ krle_zr @ 04.02.2012. 06:39 ] @
Hvala reiser, to je ono sto mi treba. Ja sam uspeo da preko poruke WM_ACTIVATE saznam kako su forme (u mojoj aplikaciji) aktivirane ali ne na globalnom nivou.

Hvala jos jednom