Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Auflösung,Frequenz,Icons wiederherstellen ? (https://www.delphipraxis.net/59657-aufloesung-frequenz-icons-wiederherstellen.html)

Vader 26. Dez 2005 18:17


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:
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;
ich hab den code von muetze1 ausprobiert, das funzt,die auflösung und frequenz wird
umgestellt, aber wie bekomme ich die alten wieder zurück wenn ich mein programm schließe


1. ist mein funktionsaufruf so richtig ?

Delphi-Quellcode:
ChangeScreen(800,600,85,'c:\saveicon.exe')
2.welchen code muß ich in das ereigniss "onclose" schreiben, das meine alten einstellungen
wiederhergestellt werden ?

mfg vader

Vader 26. Dez 2005 21:02

Re: Auflösung,Frequenz,Icons wiederherstellen ?
 
hallo,

keiner eine idee ?

mfg vader

Muetze1 26. Dez 2005 21:23

Re: Auflösung,Frequenz,Icons wiederherstellen ?
 
Zitat:

Zitat von Vader
hallo,

keiner eine idee ?

mfg vader

Keine Zeit?

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.

Vader 27. Dez 2005 07:53

Re: Auflösung,Frequenz,Icons wiederherstellen ?
 
hallo,

ich komm aber nicht drauf !!!

mfg vader

fkerber 27. Dez 2005 08:04

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

Muetze1 27. Dez 2005 12:59

Re: Auflösung,Frequenz,Icons wiederherstellen ?
 
Zitat:

Zitat von Muetze1
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.

Für alle faulen, blinden und schlechten Leser:

Delphi-Quellcode:
ChangeScreen(0, 0, 0, 'c:\saveicon.exe');

Vader 27. Dez 2005 20:30

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:
ChangeScreen(0, 0, 0, 'c:\saveicon.exe');
mfg vader

Muetze1 28. Dez 2005 01:15

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?

Luckie 28. Dez 2005 06:07

Re: Auflösung,Frequenz,Icons wiederherstellen ?
 
Liegt auch die Anwendung saveicon.exe im Root von Laufwerk c:?

Muetze1 28. Dez 2005 10:55

Re: Auflösung,Frequenz,Icons wiederherstellen ?
 
Zitat:

Zitat von Luckie
Liegt auch die Anwendung saveicon.exe im Root von Laufwerk c:?

Die würde aber auch nicht dafür sorgen dei Auflösung zurück zu drehen, oder?

Vader 28. Dez 2005 11:28

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

Luckie 28. Dez 2005 11:31

Re: Auflösung,Frequenz,Icons wiederherstellen ?
 
Zitat:

Zitat von Muetze1
Zitat:

Zitat von Luckie
Liegt auch die Anwendung saveicon.exe im Root von Laufwerk c:?

Die würde aber auch nicht dafür sorgen dei Auflösung zurück zu drehen, oder?

Ichhabe mir den Code nicht so genau angeguckt, deswegen weiß ich nicht, was der Code macht, wenn er die Exe nicht findet. Und ich will nur mal so am Rande erwähnen, dass das meine umbenannten LuckieDIPS sind. :-?

Muetze1 28. Dez 2005 11:59

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.

Luckie 28. Dez 2005 12:08

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.

Vader 28. Dez 2005 12:38

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:
ChangeScreen(800,600,85,'c:\saveicon.exe')
aufrufe ändert er zwar auflösung und frequenz aber er greift nicht auf das saveicon.exe zu,
weil ich hab nachgeschaut in der datei wo die positionen abgespeichert werden, dort ist nichts gesichert !

mfh vader

jim_raynor 28. Dez 2005 12:49

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 (http://turbo.gamedev.net) nutzen, um nur die Auflösung zu ändern.

P.S: Als Funktionsaufruf sollst du nur das Verzeichnis der saveicon.exe angeben und nicht die exe selbst ...

Vader 28. Dez 2005 14:08

Re: Auflösung,Frequenz,Icons wiederherstellen ?
 
hallo,

dort war der teufel im detail , jim_raynor hat geschrieben

Zitat:

P.S: Als Funktionsaufruf sollst du nur das Verzeichnis der saveicon.exe angeben und nicht die exe selbst ...
jetzt funzt es, super herzlichen dank an alle !

mfg vader

Vader 29. Dez 2005 14:30

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

Luckie 29. Dez 2005 14:33

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?

Vader 29. Dez 2005 16:32

Re: Auflösung,Frequenz,Icons wiederherstellen ?
 
hallo,
danke !!

mfg vader

ferby 4. Jan 2006 14:21

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

ferby 5. Jan 2006 13:07

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:
// ------------------------------------------------------------------------------ // 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;
Danke an alle die mir geholfen haben diesen Quellcode Fertig zu stellen!!


mfg,
Ferby

Muetze1 5. Jan 2006 13:25

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.

ferby 5. Jan 2006 13:33

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

Muetze1 5. Jan 2006 13:41

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:

Zitat von MSDN GetDeviceCaps(VREFRESH)
Windows NT/2000/XP: For display devices: the current vertical refresh rate of the device, in cycles per second (Hz).

A vertical refresh rate value of 0 or 1 represents the display hardware's default refresh rate. This default rate is typically set by switches on a display card or computer motherboard, or by a configuration program that does not use display functions such as ChangeDisplaySettings.

Mit anderen Worten:

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.

ferby 5. Jan 2006 15:22

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

Muetze1 5. Jan 2006 22:00

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;

ferby 6. Jan 2006 11:57

Re: Auflösung,Frequenz,Icons wiederherstellen ?
 
Hi,


Ich schau mir deine Funktion später mal ein wenig an und probier sie aus,
danke,



Ferby

ferby 6. Jan 2006 22:34

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'

Muetze1 6. Jan 2006 22:47

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 03:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz