26. januar 2000 - 18:13Der er
10 kommentarer og 1 løsning
Screen Alginment
Hej
Så blev det vist tid til at prøve at bruge et par point her på eksperten.dk og se om man kunne få lidt hjælp :)
Jeg har et lidt specielt problem.
Jeg har et program, der ligger og kører på min maskine og som aligner sig selv til en af siderne (top, left, bottom, top) af skærmen alt efter hvad man vælger. Dette er ikke et program som jeg har lavet, men jeg finder dette lidt irriterende og jeg har så begivet mig i kast med at prøve at fjerne programmets alginment fra skærmen. Sådan at når man maximerer et andet program så ligger det sig ikke op af programmet, men istedet for ligger alle programmer sig hen over programmet. (ex. på det med at programmer lægger sig til en af siderne og forhindrer andre programmer i at bruge deres plads kan ses på programmer som taskbaren og ICQ).
Jeg vil så selv lave et lille program der kan gøre sådan at jeg får den fulde skærmplads igen.
Helt præcis ønsker jeg altså en procedure der kan gøre sådan at windows bruger den fulde skærmplads igen også selvom et andet program har ændret på dette.
Jeg går udfra at disse andre programmer, der skal udnytte hele skærmarealet, er ALLE andre programmer - dvs. også dem du ikke har lavet selv? For egenudviklede programmer giver du mig sikkert ret i, at det er et meget lille problem.
ja, det drejer sig om programmer som andre har lavet.
men jeg tror nu ikke at løsningen ligger i at man skal give det program besked på at fjerne sin alignment, jeg kunne forestille mig at der er et APIkald hvofra man kan angive det areal som programmerne har til rådighed ... altså måske noget med Clientarea(screen.width, Screen.height);
Men jeg har ikke kunnet finde et sådant kald nogen steder, så måske er mit bud langt fra det der egentlig skal til ... blah, det ender sgu' nok med at jeg må gi' op, men det kunne være sjovt at finde ud af :)
Jeg er bange for at hvis du nogensinde fik det omtalte kald til at virke, dvs. at du fortæller det alllignede program at det har en højde/bredde på 0 pixels tilrådighed, så vil resultatet bare være at det er 0 pixels bredt....
delphi>> jeg tror du har misforstået det lidt, jeg ønsker ikke at fortælle et program at det ikke længere må benytte sin alignment, jeg ønsker at fortælle de andre programmer at de godt må bruge den plads som det alignede program har skæret væk, altså gøre sådan at de andre programmer kan lægge sig hen over det alignede program... jaa.. det er lidt indviklet at forklare :)
dj>Prøv at kigge på Windows API kaldet SetWindowsPos. Jeg tror det kan klare noget at det du er ude efter. Du kan finde de vinduer du har brug for, og den windows handle du skal bruge, men API kaldet EnumWindsows.
Det er selvfølgeligt nødvendigt at lave et lille program der viser dig de aktive vinduer og hvor du så vælger hvilke du vil have skal ændre størrelse o.s.v. Du kan ikke lave noget der ændre de pågældende programmer permanent, du er nødt til at håndtere det for hver gang det pågældende program bliver aktiveret. men det regnede du vel også med ?
Det kan godt ske at det er setWindowPos der skal bruges, men jeg kan ihvertifald ikke få den til at virke sådan at felt som programmet har aligned sig til på skærmen bliver frigivet. Jeg synes mest det ser ud til at SetWindowPos har at gøre med om programmet skal være topmost og det er ikke helt det jeg skal bruge til noget.
Du kan se det hvis du tager ICQ og trækker den helt ud i den ene side af skærmen, så lægger den sig ligesom til skærmens kant. Og når man så maksimerer et andet program, så lægger det sig til ICQ'ets kant og ikke til skærmens kant. Det er der jeg ønsker at gøre sådan at jeg kan maksimere et program til skærmens kant istedet for til ICQ.
Dette skal så kunne gøres fra et lille program jeg vil lave. Jeg har brugt ICQ til at teste din SetWindowPos ting på, og det virker også nongenlunde, ICQ bliver flyttet fra sin nuværende alignment og til et andet sted på skærmen, men selve det felt ude i siden hvor ICQ var før bliver først fjernet når jeg trækker i ICQ manuelt efter flytningen er sket. Det er det jeg vil have til at ske uden at man selv skal trække i ICQ.
Det kan godt ske at det er lidt svært at forstå helt præcis hvad der er jeg mener med det, men du kan selv se ved at lave indsætte det her:
... var a: Thandle; begin a:=findwindow(0,'(Dit ICQ nummer)'); if SetWindowPos(a,HWND_TOP,500,500,500,500,SWP_NOSENDCHANGING)=false then showmessage('failed'); end; ..
Denne rykker fint nok programmet væk fra sin alignment, men selve den alignment bliver først frigivet når du rykker i ICQ'baren bagefter. (for at se dette, kræver det at du har et program maksimeret)
(NOTE: ICQ er kun ment som et eksempel her, det er meningen at det skal kunne bruges på et hvilket som helst program der fungerer på samme måde).
Btw. så synes jeg egentlig at det er mærkeligt at jeg ikke modtager en mail når nogen har kommenteret eller svaret på mit spørgsmål, selv om jeg har krydset af at jeg gerne vil modtage en besked herom ... skod!
Jeg har ledt lidt efter det du har brug for og her er noget af det jeg har fundet. Dette bruger taskbaren som eks. men det samme er gældende for f.eks. ICQ vinduet:
if you maximize a window after hiding the taskbar, you'll get an empty area where the taskbar used to be and you don't get a full-screen window. You may also need to temporarily disable the AlwaysOnTop feature of the taskbar, allowing your Forms to pass above the taskbar.
Screen Area
A quite easy solution is to use the GetSystemMetrics, GetWindowRect and SystemParametersInfo API routines.
procedure FullScreenArea; { set workarea to full screen } var rcWork: TRect; begin rcWork.Top:=0; rcWork.Left:=0; rcWork.Bottom:=GetSystemMetrics(SM_CYSCREEN); rcWork.Right:=GetSystemMetrics(SM_CXSCREEN); SystemParametersInfo (SPI_SETWORKAREA, 0, @rcWork, SPIF_SENDCHANGE); end;
procedure StandardArea; { set workarea to standard screen (= excluding taskbar) } var hApp: HWND; rcApp, rcWork: TRect; begin { prepare a default fullscreen workarea } rcWork.Top:=0; rcWork.Left:=0; rcWork.Bottom:= GetSystemMetrics(SM_CYSCREEN); rcWork.Right:= GetSystemMetrics(SM_CXSCREEN);
{ get the taskbar handle } hApp := FindWindow('Shell_TrayWnd', ''); if hApp <> 0 then begin { get the size of the taskbar } GetWindowRect(hApp, rcApp); { cut the workarea to place the taskbar } if rcApp.Right<rcWork.Right then rcWork.Left:=rcApp.Right; { bar on left edge } if rcApp.Bottom<rcWork.Bottom then rcWork.Top:=rcApp.Bottom; { bar on top edge } if rcApp.Left>0 then rcWork.Right:=rcApp.Left; { bar on right edge } if rcApp.Top>0 then rcWork.Bottom:=rcApp.Top; { bar on bottom edge } end;
TaskBar On Top or Not? The trick is to use API's SetWindowPos with HWND_TOPMOST or HWND_BOTTOM as 2nd parameter.
procedure TaskBarOnTop(bOnTop: boolean); var hApp: HWND; begin { get the taskbar handle } hApp := FindWindow('Shell_TrayWnd', ''); if hApp <> 0 then begin if bOnTop then setWindowPos(hApp,HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE) else setWindowPos(hApp,HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE); end; end;
procedure SetTaskBarOnTop; begin TaskBarOnTop(True); end;
procedure SetTaskBarAtBottom; begin TaskBarOnTop(False); end;
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.