![]() |
Auflösung,Frequenz,Icons wiederherstellen ?
hallo,
muetze1 hat einen code von ferby modifiziert " Auflösung und Frequenz ändern, Desktopicons sichern und alles dann wiederherstellen !
Delphi-Quellcode:
ich hab den code von muetze1 ausprobiert, das funzt,die auflösung und frequenz wird
Uses
ShellAPI, registry; // auch wenn du es nicht wolltest, nun hast doch ein wenig Registry mit drinne - aber nur lesen... .... Var ScreenAlt: TPoint; // diese solltest du schon haben ScreenAltFrequenz : Integer; // diese kommt neu hinzu Function ChangeScreen(AWidth, AHeight: Word; AFrequenz: Integer; Const APfad: string): Boolean; // modified by Muetze1 Const ENUM_CURRENT_SETTINGS : Cardinal = Cardinal(-1);//$ffffffff; // = -1 Var lpDevMode: TDeviceMode; saveiconherstellen: boolean; lRegInfo : TRegistry; Begin saveiconherstellen := false; If ( AWidth <> 0 ) Then Begin ScreenAlt.x := Screen.Width; ScreenAlt.y := Screen.Height; ScreenAltFrequenz := 0; // diese Variable noch definieren If ( EnumDisplaySettings(Nil, ENUM_CURRENT_SETTINGS, lpDevMode) ) Then Begin If ( ( lpDevMode.dmFields And DM_PELSWIDTH ) > 0 ) Then ScreenAlt.x := lpDevMode.dmPelsWidth; If ( ( lpDevMode.dmFields And DM_PELSHEIGHT ) > 0 ) Then ScreenAlt.y := lpDevMode.dmPelsHeight; If ( ( lpDevMode.dmFields And DM_DISPLAYFREQUENCY ) > 0 ) Then ScreenAltFrequenz := lpDevMode.dmDisplayFrequency Else If ( Win32Platform = VER_PLATFORM_WIN32_WINDOWS ) Then // Win9x/ME Begin lRegInfo := TRegistry.Create(KEY_READ); lRegInfo.RootKey := HKEY_CURRENT_CONFIG; Try If lRegInfo.OpenKey('\Display\Settings', False) Then Begin ScreenAltFrequenz := StrToIntDef(lRegInfo.ReadString('RefreshRate'), 0); End; Finally lRegInfo.CloseKey; lRegInfo.Free; End; End; End; ShellExecute(0, 'open', PChar(APfad + 'saveicon.exe'),'"\s"', nil, SW_Show); Sleep(1000); End Else Begin saveiconherstellen:=true; AWidth := ScreenAlt.X; AHeight := ScreenAlt.Y; AFrequenz := ScreenAltFrequenz; End; lpDevMode.dmFields := DM_PELSWIDTH Or DM_PELSHEIGHT; lpDevMode.dmPelsWidth := AWidth; lpDevMode.dmPelsHeight := AHeight; If ( AFrequenz > 20 ) Then // valid? Begin lpDevMode.dmDisplayFrequency := AFrequenz; lpDevMode.dmFields := lpDevMode.dmFields Or DM_DISPLAYFREQUENCY; End; Result := ChangeDisplaySettings(lpDevMode, CDS_UPDATEREGISTRY) = DISP_CHANGE_SUCCESSFUL; If saveiconherstellen Then ShellExecute(0,'open', PChar(APfad + 'saveicon.exe'),'"\r"', nil, SW_Show); If Not Result Then Begin MessageBeep(MB_ICONERROR); MessageDlg('Fehler1' +#10#10+ 'Das Programm konnte die Auflösung nicht auf '+inttostr(AWidth)+'x'+inttostr(AHeight)+ ' umstellen.' +#10+ 'Es könnte sein das der Computer diese Auflösung nicht unterstützt' +#10+ 'Sollte der Computer diese Auflösung doch unterstüzen,' +#10+ 'dann stelle bitte die Auflösung manuel ein und starte das Spiel erneut.', mtError, [mbOK], 0); Application.Terminate; End; End; umgestellt, aber wie bekomme ich die alten wieder zurück wenn ich mein programm schließe 1. ist mein funktionsaufruf so richtig ?
Delphi-Quellcode:
2.welchen code muß ich in das ereigniss "onclose" schreiben, das meine alten einstellungen
ChangeScreen(800,600,85,'c:\saveicon.exe')
wiederhergestellt werden ? mfg vader |
Re: Auflösung,Frequenz,Icons wiederherstellen ?
hallo,
keiner eine idee ? mfg vader |
Re: Auflösung,Frequenz,Icons wiederherstellen ?
Zitat:
Anscheinend nicht, wenn man nach 3 Stunden wieder pusht, obwohl es nicht erlaubt ist. Im Alter von 35 sollte man vllt. auch ein wenig Geduld haben, oder? Und selbst wenn, der Code ist doch leicht zu durchschauen. Wiederherstellung der alten Daten erfolgt mit einer Auflösungsweite von 0 - also am besten im OnClose "0, 0, 0," sowie den Pfad zu der EXE angeben. |
Re: Auflösung,Frequenz,Icons wiederherstellen ?
hallo,
ich komm aber nicht drauf !!! mfg vader |
Re: Auflösung,Frequenz,Icons wiederherstellen ?
Hi!
Hast du den Post über dir mal gelesen? Da steht doch ein Tipp drin, hast du den mal ausprobiert? Ciao Frederic |
Re: Auflösung,Frequenz,Icons wiederherstellen ?
Zitat:
Delphi-Quellcode:
ChangeScreen(0, 0, 0, 'c:\saveicon.exe');
|
Re: Auflösung,Frequenz,Icons wiederherstellen ?
sorry,
hab ich überlesen, aber es funzt nicht, es bleibt die veränderte auflösung und die icons stellen sich auch nicht zurück, wenn ich das in onclose reinschreibe!
Delphi-Quellcode:
mfg vader
ChangeScreen(0, 0, 0, 'c:\saveicon.exe');
|
Re: Auflösung,Frequenz,Icons wiederherstellen ?
Sicher das OnClose ausgelöst wird? Ansonsten nimm dir eine Form und packe 2 Buttons rauf. Im OnClick des einen verstellst du die Auflösung, im OnClick des anderen stellst du sie wieder her. Also beide Aufrufe mal "per Hand" auslösen. Klappt das denn?
|
Re: Auflösung,Frequenz,Icons wiederherstellen ?
Liegt auch die Anwendung saveicon.exe im Root von Laufwerk c:?
|
Re: Auflösung,Frequenz,Icons wiederherstellen ?
Zitat:
|
Re: Auflösung,Frequenz,Icons wiederherstellen ?
hallo muetze1,hallo luckie,
mit den zweiten button funzt es, aber das zurücksichern der icons mit saveicon.exe klappt nicht ich habe aber den pfad richtig eingestellt, hat das mit "s\" "r\" zutun ? mfg vader |
Re: Auflösung,Frequenz,Icons wiederherstellen ?
Zitat:
![]() |
Re: Auflösung,Frequenz,Icons wiederherstellen ?
@Luckie: da er geschrieben hatte, das die Auflösung nicht zurück gesetzt wird (was von dem Code erledigt wird), kann es also nicht nur an deinem Programm liegen - wenn überhaupt.
@Vader: Mit anderen Worten: Im OnClose wird nix aufgerufen - entweder wird dein OnClose nicht ausgelöst oder du rufst darin nicht die Funktion auf - vllt. eine falsche Bedingung zuvor? Und das mit den Icons: Ja, die Parameter sind schon wichtig. Da Luckie ja intuitive Programme schreibt, vermute ich mal das /s für "save" - also Iconpositionen sichern steht und /r für "restore" - also Iconpositionen wiederherstellen. Somit kann es damit zu tun haben - aber in dem Code oben ist das soweit richtig drinne. Warum schaust du dir nicht einfach mal die Parameterliste von Luckies Programm an? Diese hat er bestimmt auf seiner Website vermerkt und dokumentiert oder direkt im Programm vermerkt. Im Normalfall kannst du eine Hilfeseite mit /? erreichen. |
Re: Auflösung,Frequenz,Icons wiederherstellen ?
Ich dachte vielleicht, dass das Programm die Prozedur eventuell nicht bis zu Ende ausführt, wenn es die datei nicht findet oder so. Das meinte ich.
|
Re: Auflösung,Frequenz,Icons wiederherstellen ?
hallo,
fogendes, hab bei luckie nachgeschaut die parameter "s" und "r" passen für sichern und wiederherstellen, aber wen ich die funktion
Delphi-Quellcode:
aufrufe ändert er zwar auflösung und frequenz aber er greift nicht auf das saveicon.exe zu,
ChangeScreen(800,600,85,'c:\saveicon.exe')
weil ich hab nachgeschaut in der datei wo die positionen abgespeichert werden, dort ist nichts gesichert ! mfh vader |
Re: Auflösung,Frequenz,Icons wiederherstellen ?
MMh. Vielleicht sollte man sich ein klitzeklein wenig mit OpenGL/DirectX auseinandersetzen und dort die Funktionen zum Ändern der Bildauflösung nutzen. Denn diese verstellen nichts an den Einstellungen/Icons und setzen die Auflösung automatisch zurück, wenn die Anwendung den Focus verliert/beendet wird. Da ich nur den DirectX Wrapper DelphiX nutze, kann ich leider nicht sagen, wie es genau funktioniert, aber theoretisch kannst du zum Beispiel DelphiX (
![]() P.S: Als Funktionsaufruf sollst du nur das Verzeichnis der saveicon.exe angeben und nicht die exe selbst ... |
Re: Auflösung,Frequenz,Icons wiederherstellen ?
hallo,
dort war der teufel im detail , jim_raynor hat geschrieben Zitat:
mfg vader |
Re: Auflösung,Frequenz,Icons wiederherstellen ?
hallo,
ich hab da noch was, wo ich nicht schlau daraus werde,ich entpacke ferbys programm irgendwo in einen ordner auf meinem rechner,jetzt meine frage, wie ist es dann möglich das er auf saceicon.exe zugreifen kann, weil er muß ja beim aufruf der funktion "function changescreen(Width, Height: Word; pfad: string): Boolean; " den vorgegebene pfad angegeben, und den kann er ja nicht wissen wo ich das entpackt habe ? bei einem setup kann ich das noch nachvollziehen aber bei einer zipdatei ? mfg vader |
Re: Auflösung,Frequenz,Icons wiederherstellen ?
Vielleicht weil die Exe im Programmverzeichnis leigt und er es mit ParamStr(0) ermittelt?
Werde ich auch im About Dialog erwähnt? |
Re: Auflösung,Frequenz,Icons wiederherstellen ?
hallo,
danke !! mfg vader |
Re: Auflösung,Frequenz,Icons wiederherstellen ?
Hallo,
exisitiert bei dir auch die Datei APfad + 'saveicon.exe' ??? Bei mir war der Pfad falsch, aber es kam keine Fehlermeldung, so bin ich auch erst relativ spät drauf gekommen das der Pfad gar nicht richtig war... Ferby |
Re: Auflösung,Frequenz,Icons wiederherstellen ?
Hallo,
@ Vader Das kann ich erklären. Bei der Setup datei istdie Variabel pfad als Constante ss definiert: const pfad='C:\Programme\Ferby\Ferby-Fall_II\data\'; aber bei der Zip datei habe ich die exe neu gemacht mit einen anderen pfad, und zwar so: const pfad='data\'; deshalb funktionierts, egal wo du das Spiel entpackst. ------- Noch was zur Auflösung ändern und zur Frquenz wieder herstellen, Ich habe jetzt meinen eigenen Quellcode erweitert, er ändert die Auflösung und nacher stellt er die alte Auflösung, Bildschirmfrequenz und Desktopsymbole wieder her:
Delphi-Quellcode:
Danke an alle die mir geholfen haben diesen Quellcode Fertig zu stellen!!
// ------------------------------------------------------------------------------ // Screen // ---------------------------------
function changescreen(Width, Height: Word; pfad: string): Boolean; var lpDevMode: TDeviceMode; saveiconherstellen: boolean; begin saveiconherstellen:=false; if width<>0 then begin ScreenAlt.x:=(screen.width); ScreenAlt.y:=(screen.height); refreshalt:=getrefresH; ShellExecute(0,'open', PChar(pfad + 'saveicon.exe'),'"\s"', nil, SW_Show); sleep(1000); end else begin saveiconherstellen:=true; width:=ScreenAlt.X; height:=ScreenAlt.Y; end; Result := EnumDisplaySettings(nil, 0, lpDevMode); if Result then begin lpDevMode.dmFields := DM_PELSWIDTH Or DM_PELSHEIGHT; lpDevMode.dmPelsWidth := Width; lpDevMode.dmPelsHeight := Height; lpDevMode.dmDisplayFrequency := refreshAlt; lpDevMode.dmFields := lpDevMode.dmFields Or DM_DISPLAYFREQUENCY; Result := ChangeDisplaySettings(lpDevMode, CDS_UPDATEREGISTRY) = DISP_CHANGE_SUCCESSFUL; if saveiconherstellen then ShellExecute(0,'open', PChar(pfad + 'saveicon.exe'),'"\r"', nil, SW_Show); end; if not Result then begin MessageBeep(MB_ICONERROR); MessageDlg('Fehler1' +#10#10+ 'Das Programm konnte die Auflösung nicht auf '+inttostr(width)+'x'+inttostr(height)+ ' umstellen.' +#10+ 'Es könnte sein das der Computer diese Auflösung nicht unterstützt' +#10+ 'Sollte der Computer diese Auflösung doch unterstüzen,' +#10+ 'dann stelle bitte die Auflösung manuel ein und starte das Spiel erneut.', mtError, [mbOK], 0); Application.Terminate; end; end; function GetRefresh : Integer; var hDC : Cardinal; begin hDC := GetDC(0); Result := GetDeviceCaps(hDC, VREFRESH); ReleaseDC(0, hDC); end; mfg, Ferby |
Re: Auflösung,Frequenz,Icons wiederherstellen ?
Von der Methode mit dem GetDeviceCaps() kann ich dir nur abraten, da er vielmals einen falschen Wert bzw. 0 zurück liefert.
|
Re: Auflösung,Frequenz,Icons wiederherstellen ?
Hallo,
ich habe das auf 3 Laptops und 1 Computer mit Windows XP und 2000 getestet und es hat funktioniert. Wieso sollte es falsche Werte zurückliefern???? Ferby |
Re: Auflösung,Frequenz,Icons wiederherstellen ?
Probier es z.B. mal unter Windows 9x und vor allem auch mal mit SiS Grafikkartentreibern und bei alten ATI Grafikkarten und deren Treiber (Rage Pro z.B.).
/EDIT: Ansonsten nochmal dazu die MSDN: Zitat:
a) Windows 9x ist komplett aussen vor, funktioniert also gar nicht. b) Eine Rückgabe von 0 oder 1 für die "default refresh rate" würde ChangeDisplaySettings() beim zurücksetzen nicht akzeptieren. EnumDisplaySettings() selber kann dabei auch 0 bzw. 1 für die "default refresh rate" zurück liefern, aber beim setzen aktzeptiert es ChangeDisplaySettings() nicht - bzw. es ist nicht dokumentiert. Daher kann es dir ein Treiber von einem Hersteller leicht um die Ohren hauen. |
Re: Auflösung,Frequenz,Icons wiederherstellen ?
Hallo,
wie würdest du die Bildschirmfrequenz rausbekommen?? Ich habe mir deinen verbesserten Quellcode von mir schon angesehen, leider durchschau ich ihn nicht ganz. Kannst du mir die Bereiche Isolieren die nur zum Auslesen der Bildschirmfrequenz verwendet werden?? Ferby |
Re: Auflösung,Frequenz,Icons wiederherstellen ?
Delphi-Quellcode:
Function GetVRefresh: Integer;
Const ENUM_CURRENT_SETTINGS : Cardinal = Cardinal(-1);//$ffffffff; // = -1 Var lpDevMode: TDeviceMode; lRegInfo : TRegistry; lRefresh : Integer; lDesktop : HDC; Begin lRefresh := 0; FillChar(lpDevMode, SizeOf(lpDevMode), 0); lpDevMode.dwSize := SizeOf(lpDevMode); If ( EnumDisplaySettings(Nil, ENUM_CURRENT_SETTINGS, lpDevMode) ) Then Begin If ( ( lpDevMode.dmFields And DM_DISPLAYFREQUENCY ) > 0 ) Then lRefresh := lpDevMode.dmDisplayFrequency Else If ( Win32Platform = VER_PLATFORM_WIN32_WINDOWS ) Then // Win9x/ME Begin lRegInfo := TRegistry.Create(KEY_READ); lRegInfo.RootKey := HKEY_CURRENT_CONFIG; Try If lRegInfo.OpenKey('\Display\Settings', False) Then Begin lRefresh := StrToIntDef(lRegInfo.ReadString('RefreshRate'), 0); End; Finally lRegInfo.CloseKey; lRegInfo.Free; End; End; End; If ( lRefresh In [0,1] ) Then // hardware default versuchen zu umgehen Begin lDesktop := GetDC(0); Try lRefresh := GetDeviceCaps(lDesktop, VREFRESH); Finally ReleaseDC(0, lDesktop); End; End; Result := lRefresh; End; |
Re: Auflösung,Frequenz,Icons wiederherstellen ?
Hi,
Ich schau mir deine Funktion später mal ein wenig an und probier sie aus, danke, Ferby |
Re: Auflösung,Frequenz,Icons wiederherstellen ?
Hallo,
bei mir kommt der Fehler zur Zeile lpDevMode.dwSize := SizeOf(lpDevMode); [Fehler] Ferby.pas(77): Undefinierter Bezeichner: 'dwSize' |
Re: Auflösung,Frequenz,Icons wiederherstellen ?
Wenn man einmal was aus'm Kopf schreibt....
... es heisst natürlich nicht "dwSize" sondern "dmSize" - aber das kann ich nun nach 24 Stunden nicht mehr korrigeren... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz