Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi ChangeResolution dreht Desktop??? (https://www.delphipraxis.net/72343-changeresolution-dreht-desktop.html)

mtin 28. Jun 2006 20:06


ChangeResolution dreht Desktop???
 
das ist mal wirklich merkwürdig!

ich benutze diese ChangeResolution-Funktion hier:
Delphi-Quellcode:
function ChangeResolution(sizex, sizey, bpp: DWORD): Boolean;
var
 DeviceMode: TDeviceModeA;
 i: Integer;
begin
 i := 0;
 Result := False;
 while EnumDisplaySettings(nil, i, DeviceMode) do begin
   with DeviceMode do
     if (dmPelsWidth = sizex) and
        (dmPelsHeight = SizeY) and
        (dmBitsPerPel = bpp) then begin
       // erst testen, bevor wir umschalten!
       case ChangeDisplaySettings(DeviceMode, CDS_TEST) of
         // es wird klappen!
         DISP_CHANGE_SUCCESSFUL:
           Result := True;

         DISP_CHANGE_RESTART:
           Showmessage('Neustart erforderlich');

         DISP_CHANGE_BADFLAGS:
           Showmessage('Ungültige Bildschirmeinstellungen');

         DISP_CHANGE_FAILED:
           Showmessage('Auflösung konnte nicht geändert werden');

         DISP_CHANGE_BADMODE:
           Showmessage('Bildschirm unterstützt diese Auflösung nicht');

         // Nur Windows NT
         DISP_CHANGE_NOTUPDATED:
           Showmessage('Registry konnte nicht aktualisiert werden');

       else
         Result := True;
       end;

       if Result then
         //jetzt wird umgeschaltet
         ChangeDisplaySettings(DeviceMode, CDS_FULLSCREEN)
     end;
   Inc(i);
 end;
end;
Zuhause funktioniert die auch perfekt(Radeon9800), aber in der Schule an den Rechnern (ham irgendsoeinen integrierten Intel-Grafikspaß) ist der Bildschirm dann auf dem Kopf! und man muss ihn erst durch zweimaliges drücken einer bestimmte Tastenkombination (Bildschirm um 90° drehen) wieder richtig herum drehen...

Hat jemand ne Ahnung woran das liegt/wie ich das lösen könnte, dass die ChangeResolution funktion sowohl zuhause als auch auf den Schulrechnern läuft?

fLaSh11 28. Jun 2006 20:11

Re: ChangeResolution dreht Desktop???
 
1.Gedanke (ohne auf Code zu schauen): vllt habt ihr ja in der Schule eine Sperre, die es verbietet, Systemeinstellungen zu verändert (wäre ganz sinnvoll :mrgreen:). Die Proc ChageResolution versucht jetzt die Auflösung zu ändern, aber nicht über die normalen Systemeinstellungen und schwupps... kommt es zu einem Fehler, der alles "verdreht" :mrgreen: (klischeehaft^^)

mtin 28. Jun 2006 20:46

Re: ChangeResolution dreht Desktop???
 
neee wir dürfen ja die auflösung verändern^^
bzw. wenn ich das in Windows mache klappts...nur die Funktion will nich....bzw mit ihr gehts ja auch nur eben mussich dann erst den bildschirm wieder richtich rum drehen...

teebee 28. Jun 2006 21:14

Re: ChangeResolution dreht Desktop???
 
In DeviceMode steht am Anfang nur Unsinn, da es eine lokale Variable ist. EnumDisplaySettings setzt nicht alle Felder in DeviceMode, sodass danach immer noch zum Teil Unsinn in DeviceMode steht (z.B. vielleicht in dmDisplayOrientation bei XP, was Du dann ja unverändert zurückgibst). Als erstes würde ich zu Beginn DeviceMode ausnullen
Delphi-Quellcode:
ZeroMemory(@DeviceMode, sizeof(DeviceMode));
und dann noch die Größe eintragen
Delphi-Quellcode:
DeviceMode.dmSize := sizeof(DeviceMode));
Letzteres empfiehlt zumindest das MSDN:
Zitat:

lpDevMode
[out] Pointer to a DEVMODE structure into which the function stores information about the specified graphics mode. Before calling EnumDisplaySettings, set the dmSize member to sizeof(DEVMODE), and set the dmDriverExtra member to indicate the size, in bytes, of the additional space available to receive private driver data.
GRuß, teebee

mtin 28. Jun 2006 21:30

Re: ChangeResolution dreht Desktop???
 
okay, danke soweit, werd das mal morgen in info testen!
aber mal nen anderer Ansatz, in der Funktion steht doch am Anfang
Delphi-Quellcode:
   with DeviceMode do
     if (dmPelsWidth = sizex) and
        (dmPelsHeight = SizeY) and
        (dmBitsPerPel = bpp) then begin
kann man da nich einfach noch (dmDisplayOrientation = xxx) anfügen? vielleicht hat noch jemand ne Ahnung welche Werte dmDisplayOrientation annehmen kann?

BenBE 28. Jun 2006 22:56

Re: ChangeResolution dreht Desktop???
 
Soweit ich mich erinnere ist dmOrientation eine einfache Angabe in Grad des Winkels um den gedreht wird. In diesem Fall sollte also die Prüfung auf =0 vollkommen ausreichen.

teebee 29. Jun 2006 07:11

Re: ChangeResolution dreht Desktop???
 
Zitat:

Zitat von mtin
kann man da nich einfach noch (dmDisplayOrientation = xxx) anfügen?

dmDisplayOrientation wird laut MSDN nicht von MSDN-Library durchsuchenEnumDisplaySettings gesetzt, d.h. da kann immernoch Müll drin stehen (wenn DeviceMode nicht ausgenullt wird), sodass der Vergleich evtl. nie erfüllt wird. Unter MSDN-Library durchsuchenDEVMODE findest Du die möglichen Werte.

Gruß, teebee

Muetze1 29. Jun 2006 08:53

Re: ChangeResolution dreht Desktop???
 
Ausserdem musst du durch eine Bitmaske (dmFields) angeben welche Informationen in der DEVMODE Struktur gültig sind! So lange du also dieses Bit für die Orientation (DM_DISPLAYORIENTATION) nicht setzt, wird diese auch nicht beachtet.

mtin 29. Jun 2006 09:59

Re: ChangeResolution dreht Desktop???
 
mh, bin glaub ich zu dämlich dazu :wall:
also in dem TDevMode von Delphi 7 gibts gar kein dmDisplayOrientation

was jetzt :D

xaromz 29. Jun 2006 10:56

Re: ChangeResolution dreht Desktop???
 
Hallo,
Zitat:

Zitat von mtin
mh, bin glaub ich zu dämlich dazu :wall:
also in dem TDevMode von Delphi 7 gibts gar kein dmDisplayOrientation

was jetzt :D

wenn Du in DeviceMode.dmSize die richtige Größe angegeben und am Anfang alles mit Null gefüllt hast, dann sollte das eigentlich kein Problem sein.

Gruß
xaromz


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:24 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