Avatar billede hr__hallandsen Nybegynder
04. november 2009 - 11:48 Der er 3 kommentarer

Detektere resize af taskbar

Jeg har brug for at kunne detektere, når brugeren resizer taskbaren. Da jeg går ud fra, at denne modtager en WM_RESIZE, når denne hændelse finder sted, kunne jeg forestille mig, det er et globalt hook, jeg skal have fat i. Jeg har forsøgt mig med SetWindowsHookEx(WH_CALLWNDPROCRET, ..., men jeg kan simpelthen ikke få det til at virke. Er der nogen, der kan hjælpe med dette? Modtager taskbaren slet ikke en WM_RESIZE, er andre løsningsforslag også velkomne.
Avatar billede preppydude Nybegynder
04. november 2009 - 16:37 #1
Vil du bruge hooks? Ellers kan du alternativt smidde en timer ind og prøve noget ala det her:

uses ShellAPI;

var
  LastHeight: Integer = 0;
  LastWidth:  Integer = 0;

function DidTaskbarResize: Boolean;
var
  AppBar: TAppBarData;
begin
  Result := False;
  FillChar(AppBar, SizeOf(TAppBarData), 0);
  AppBar.cbSize := SizeOf(TAppBarData);

  if SHAppBarMessage(ABM_GETTASKBARPOS, AppBar) = 0 then Exit;

  if (LastHeight=0) then LastHeight := AppBar.rc.Bottom-AppBar.rc.Top;
  if (LastWidth=0) then LastWidth := AppBar.rc.Right-AppBar.rc.Left;

  Result := not ((LastHeight=AppBar.rc.Bottom-AppBar.rc.Top)
            and (LastWidth=AppBar.rc.Right-AppBar.rc.Left));

  LastHeight := AppBar.rc.Bottom-AppBar.rc.Top;
  LastWidth  := AppBar.rc.Right-AppBar.rc.Left;
end;

procedure TMainForm.CheckTimerTimer(Sender: TObject);
begin
  if (DidTaskbarResize) then
    Log.Lines.Add('Taskbar resized!');
end;
Avatar billede hr__hallandsen Nybegynder
04. november 2009 - 17:42 #2
Den mulighed har jeg også overvejet. Men jeg vil helst have en løsning, hvor programmet ikke hele tiden skal kontrollere for et eller andet, men hvor det automatisk bliver underrettet i det øjeblik, der sker noget.
Avatar billede preppydude Nybegynder
05. november 2009 - 06:26 #3
Om du tjekker alle events der flyver ind i Shell_TrayWnd eller om du tjekker via den simple metode er vel lige meget? :) Det andet virker en smule overkill.

Men men men.. Hvis du vil lave det sådan, så hedder eventet WM_SIZING og du skal bruge SetWindowsHookEx(WH_CALLWNDPROC, ...). Fremgangsmåden går jeg ud fra du kender. Hvis ikke, så kan du se en lignende hook her:
www.swissdelphicenter.ch/torry/showcode.php?id=1212

Det er ikke helt det samme, men du kan få et overblik over hvad der skal til for at gøre det og en ide om hvordan det gøres.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester