Avatar billede erniez13 Nybegynder
12. august 2002 - 18:07 Der er 10 kommentarer og
1 løsning

Fjern form fra taskbar?

Hey hey!

Jeg har en form som er i en DLL fil som jeg dynamisk kalder når jeg har brug for den. Jeg vil gerne skjule denne forms knap fra taskbaren, men den kode jeg har funker ikke så godt.
Dette er den kode jeg bruger:

procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowWindow(Application.Handle, SW_HIDE);

  SetWindowLong(Application.Handle, GWL_EXSTYLE,
          GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);

  ShowWindow(Application.Handle, SW_SHOW);
end;

Dette fungerer fint i et standalone program (EXE) men så snart jeg bruger koden i min DLL fil så virker det ikke! ????

Er formen anderledes når jeg "manuelt" creater den i min DLL måske? Eller skal setwindowlong kaldes på et bestemt tidspunkt måske, eller er mine messages til og fra mit vindue fukkt eller anderledes når jeg har det indkapslet i en dll?

Hvis nogen gad prøve denne kode og måske give lidt input så kunne det være fedt!

erniez13
Avatar billede erniez13 Nybegynder
12. august 2002 - 18:23 #1
PS:
Jeg bruger Delphi 5 Enterprise

Min form bliver created således:

Form1 := TForm.Create(nil);
(Og jeg sørger selvfølgelig for at free den igen ;o) )

Håber i kan hjælpe!
Avatar billede dkn Nybegynder
12. august 2002 - 19:28 #2
erstat Application.Handle med Foorm1.handle...
Avatar billede erniez13 Nybegynder
12. august 2002 - 19:46 #3
Har jeg prøvet dkn :( Det skulle jeg måske have nævnt... Har du prøvet selv med et lille testprojekt om det funkede???
Avatar billede erniez13 Nybegynder
12. august 2002 - 20:46 #4
Ja måske skulle jeg uddybe lidt:
Jeg har fundet ud af efter megen testning at alle ovenstående funktioner returnerer succesfull undtagen setwindowlong efter udførelse, dette er fra WinAPI documentationen:

Return Values

If the function succeeds, the return value is the previous value of the specified 32-bit integer.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
If the previous value of the specified 32-bit integer is zero, and the function succeeds, the return value is zero, but the function does not clear the last error information. This makes it difficult to determine success or failure. To deal with this, you should clear the last error information by calling SetLastError(0) before calling SetWindowLong. Then, function failure will be indicated by a return value of zero and a GetLastError result that is nonzero.

Jeg bruger denne kode:

SetLastError(0);
if SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW) = 0 then
begin
Showmessage('Tis! det funkede ikke :(');
ShowMessage(SysErrorMessage(GetLastError));
end;

Og den failer hver gang ;)

Hvis jeg bruger form1.handle som dkn foreslog får jeg en acces violation...

Plez help me! I'm desperate!
Avatar billede dkn Nybegynder
12. august 2002 - 21:06 #5
form1 er ikke lavet endnu hvis du får en acces!!!
Avatar billede erniez13 Nybegynder
12. august 2002 - 21:19 #6
Hmmm, ja men hvis jeg putter koden i OnShow som mange også anbefaler så får jeg stadig en acces (Har kodet i Delphi i mange år så jeg kan godt gætte mig til de fleste ting :P )
Anyway, jeg har postet i nogle nyhedsgrupper det samme spørgsmål på engelsk som jeg synes forklarer problemet lidt bedre:

Hey Yall!

I'm trying to hide the taskbar button of a form I have encapsulated in a DLL.

I've tried ALL of the Getwindow/Setwindow stuff which everybody swears by, but that simply doesn't work...

In most examples people use this in the OnShow handler:

ShowWindow(Application.Handle, SW_HIDE);

I've tried Form.handle instead of application.handle in all the stuff I've tried out, but that just gave me an access violation.

I've tried all kinds of variations of this code, and placed it in different form events but I've had no success so far.

If I fool around with some code which looks like this par exemple:

ShowWindow(Application.Handle, SW_HIDE);
  SetWindowLong(Application.Handle, GWL_EXSTYLE,
    GetWindowLong(Application.Handle, GWL_EXSTYLE)
    or WS_EX_TOOLWINDOW );
Which works perfectly well in a standalone (EXE) app I get some weird results when I use it in my library:

The WinAPI docs it says that if Setwindowlong fails it returns 0 and then you should use getlasterror to figure out what went wrong, but when I do this:

SetLastError(0);
if SetWindowLong(Form1.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW) = 0 then
ShowMessage(SysErrorMessage(GetLastError));

GetLastError returns: "Operation Completed Sucessfully"

WTF?!?!?

If anyone has experience with this, or just the least bit of input, then yuo'd make a fellow programmer VERY happy...

erniez13
Avatar billede erniez13 Nybegynder
12. august 2002 - 22:01 #7
PS:
Det ser ud til at RIGTIG MANGE mennesker har problem med det her pi*. Prøv bare at lave en google grupper søgning på "Hide button taskbar Delphi"
Det er ret vildt, og det ser ud til at problemet ændrer sig med de forskellige Delphi versioner...

Jeg har prøvet alle de forslag folk kommer med via google grupper, så jeg er ret overbevist om at man nok bliver nødt til at forhindre at knappen overhovedet bliver vist istedet for at fjerne den efter at den er dukket op.

Jeg har prøvet at rode lidt i Forms uniten i Delphi, men kan ikke rigtig finde rundt i den, den er ikke særlig brugervenlig at kige rundt i. Hvis nogen har en idé til dette approach så kunne det osse være fedt!
Avatar billede erniez13 Nybegynder
12. august 2002 - 22:57 #8
Jeg fandt en løsning på problemet!
Tak for dine input dkn - much appreciated. Anyway, hvis nogen af jer nogensinde støder på samme problem så bare gør følgende i jeres onshow event i jeres funky dll form:

var
  H : HWnd;
begin
  H := FindWindow(Nil,'SS');
  if H <> 0 then
    begin
    ShowWindow(H, SW_HIDE);
    SetWindowLong(H, GWL_EXSTYLE,
    GetWindowLong(H, GWL_EXSTYLE)
    or WS_EX_TOOLWINDOW );
    ShowWindow(H, SW_SHOW);
    end;

Dvs. jeg finder vinduet ud fra dets caption (Her 'SS' og bruger det handle windows returnerer) Af en eller anden mystisk grund da funker TForm.handle og application handle ikke, men dette virker... Det tog 6 timer, men jeg fik løst det! MWUAHAHA!

Anyway, hvordan lukker jeg denne tråd nu?
Avatar billede erniez13 Nybegynder
12. august 2002 - 22:58 #9
test
Avatar billede erniez13 Nybegynder
12. august 2002 - 22:58 #10
Hihi! det virkede ;)
Avatar billede erniez13 Nybegynder
12. august 2002 - 23:00 #11
øhhh.. jeg troede bare jeg kunne give pointene til mig selv og det ville så være det.. men tråden er stadig åben? Er det mig der er en dummkopf ???
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