Avatar billede lsn Nybegynder
01. november 2000 - 09:50 Der er 13 kommentarer og
1 løsning

Taskbar

Hvordan laver man et program, der kan vise de minimerede vinduer i Windows-taskbaren? Man skal også kunne trykke på de minemerede vinduer, så de kan blive i normal størelse. 

Send mig venligst et eksempel til:
lsnwebmaster@email.com

Jeg har nu fået Delphi 5, så i behæver ikke at tænke på, at konverterer det til en Delphi 3 version.

Til Borris Holt: Tak får Delphi 5. Nu kan jeg endelig bruge alle dine ekspempler på www.borrisholt.com

LSN
Avatar billede borrisholt Novice
01. november 2000 - 09:59 #1
Hnnm .. Lasse forstår jeg dig ret så vil du gerne selv lave en klon af taskbaren ? Altså nare windows til at tro at din taskbar er den \"rigtigt\" ? Well good luck. Der er et eksempel på hvordan man gør i den nyeste version af MSDN, men der er skrevet i C++ og lader sig ikke sådan lige porte til Delphi ...

Jens B
Avatar billede lsn Nybegynder
01. november 2000 - 11:33 #2
Nej, nej. Mit program skal bare vise de minimerede vinduer. Og når man trykker på dem, skal de bare blive maximerede eller i normal størelse.

Kan du ikke lige sende mig et eksempel, som virker i Delphi?

LSN
Avatar billede carstensm Nybegynder
01. november 2000 - 23:15 #3
Du spørger om hvordan et helt almindeligt windows-program laves - det var vist ikke eningen ... håber jeg :-)

Mener du ikke et program der kører i taskbarens status-område ligesom uret og lydstyrke o.s.v.?

Carsten
Avatar billede michaelras Nybegynder
02. november 2000 - 14:16 #4
En nem måde ville være at køre en FindWindow løkke og teste om vinduet er visible - så får du ALLE åbne vinduer...

Michael
Avatar billede michaelras Nybegynder
02. november 2000 - 14:33 #5
OK rettelse til ovenstående... det er selvfølgelig EnumWindows der skal bruges...

EnumWindows kører alle top-level vinduer igennem og kalder en brugerdefineret funktion med vinduets handle som parameter...

Så er det bare at bruge GetWindowLong(vinduets_handle, GWL_STYLE) og teste for WS_VISIBLE

Flags := GetWindowLong(vindue_handle, GWL_STYLE);
if (Flags and WS_VISIBLE) <> 0 then ShowMessage(\'Visible Top-level vindue!\');

Michael
Avatar billede borrisholt Novice
02. november 2000 - 14:47 #6
Du er på sporet Michael, men ikke helt ... Jeg arbejder lige på sagen, og dit forslag giver \"for mange\" vinduer ....

Jens B
Avatar billede michaelras Nybegynder
02. november 2000 - 14:52 #7
Måske skulle man også filtrere WS_POPUP vinduer fra... ved ikke om det er det

Michael
Avatar billede borrisholt Novice
02. november 2000 - 14:55 #8
Der var den sq !

if (Flags and WS_VISIBLE <> 0) and (Flags and WS_SYSMENU <> 0) and (Flags and WS_POPUP = 0)then ...

Hvis det udtryk evaluerer til sandt så findes den i taskbaren ... For et komplet eksempel skriv til Jens@borrisholt.com

Jens b
Avatar billede michaelras Nybegynder
02. november 2000 - 15:02 #9
Måske skulle man lige skrive det hele:

function MinEnumWindows(Hnd: THandle; LParam : Integer) : Boolean;
begin
  if (Flags and WS_VISIBLE <> 0) osv osv
end;

Og starte det hele sådan her:
EnumWindows(@MinEnumWindows, 0);

Michael
Avatar billede michaelras Nybegynder
02. november 2000 - 15:05 #10
Selvfølgelig:

function MinEnumWindows(Hnd: THandle; LParam : Integer) : Boolean;
  var Flags :Integer;
begin
  Flags := GetWindowLong(Hnd, GWL_STYLE);
  if (Flags and WS_VISIBLE <> 0) osv osv
end;

Michael

PS: Det er altså besværligt at skulle huske det hele i hovedet (Har ikke fået reinstalleret Delphi endnu efter formatering af harddisk :)
Avatar billede michaelras Nybegynder
02. november 2000 - 15:09 #11
Ved egentlig ikke om det er nødvendigt at specificere MinEnumWindows som stdcall ??
altså:
function MinEnumWindows(Hnd: THandle; LParam : Integer) : Boolean; stdcall;

Michael
Avatar billede michaelras Nybegynder
02. november 2000 - 15:16 #12
Eller:

function MinEnumWindows(Hnd: THandle; LParam : Integer) : Integer; stdcall;

Det er noget med at WIN32 API\'et bruger integers som Boolean...

Michael
Avatar billede borrisholt Novice
02. november 2000 - 15:22 #13
En form, en knap og det her :

Function EnumProc( wnd: HWND; Memo : TMemo ): BOOL; stdcall;
Var
  buf, caption: Array [0..255] of char;
  Flags : Longint;
Begin
  result := True;
  Flags := GetWindowLong(wnd, GWL_STYLE);

  if (Flags and WS_VISIBLE <> 0) and (Flags and WS_SYSMENU <> 0) and (Flags and WS_POPUP = 0)then
  begin
    GetClassname( wnd, buf, 256 );
    SendMessage( wnd, WM_GETTEXT, 256, integer(@caption));
    Memo.Lines.Add(Format(\'Caption : %s  Classname : %s\',[caption, buf]));
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Clear;
  EnumWindows( @EnumProc, integer( Memo1 ));
end;

Jens B
Avatar billede lsn Nybegynder
03. november 2000 - 15:12 #14
Okay. Svaret er accepteret.

LSN
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
Kategori
Kurser inden for grundlæggende programmering

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