12. august 2002 - 18:07Der 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!
Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
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...
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));
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!
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!
ø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 ???
Synes godt om
Ny brugerNybegynder
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.