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 Bildschirm drehen (https://www.delphipraxis.net/104257-bildschirm-drehen.html)

ddcool 30. Nov 2007 10:29


Bildschirm drehen
 
Hallo zusammen,

ich verzweifle langsam. Ich bin jetzt seit 2 Stunden im Internet und auch hier im Forum am suchen nach einer Möglichkeit meinen Bildschirm um 90,180,270° drehen zu lassen. Ich habe schon einige Quelltexte gefunden und auch ausprobiert, leider ohne Erfolg.
In vielen Quelltexten wird beschrieben, es über den Wert dmDisplayOrientation zu machen, jedoch gibt es diese nicht unter CodeGear RAD.
Hier einfach mal ein Quelltext den ich probiert habe (bin sogar so weit gegangen und habe die Windows.pas mit dem Wert dmDisplayOrientation ergänzt und compiliert, auch ohne Erfolg). Alle anderen Möglichkeiten den Bildschirm zu verändern (sprich Auflösung, Bildwiederholrate, Farbtiefe etc. funktionieren):

Delphi-Quellcode:
const
  DMDO_0 = 0;
  DMDO_90 = 1;
  DMDO_180 = 2;
  DMDO_270 = 4;
  DM_DISPLAYORIENTATION = $00000080;

procedure StartMonitor;
Var
  lDevMode : TDevMode;
begin
    ZeroMemory(@lDevMode, sizeof(lDevMode));
    lDevMode.dmSize := sizeof(lDevMode);
    EnumDisplaySettings(nil, 0, lDevMode);
    lDevMode.dmFields                 := DM_PELSWIDTH or DM_PELSHEIGHT or DM_DISPLAYORIENTATION;
    lDevMode.dmDisplayOrientation     := DMDO_90;
    lDevMode.dmPelsWidth              := 600;      //Monitorweite
    lDevMode.dmPelsHeight             := 800;      //Monitorhöhe}

    case ChangeDisplaySettings(&lDevMode,CDS_UPDATEREGISTRY) of

      DISP_CHANGE_SUCCESSFUL: ShowMessage('DISP_CHANGE_SUCCESSFUL');
      DISP_CHANGE_BADFLAGS: ShowMessage('DISP_CHANGE_BADFLAGS');
      DISP_CHANGE_BADMODE: ShowMessage('DISP_CHANGE_BADMODE');
      DISP_CHANGE_BADPARAM: ShowMessage('DISP_CHANGE_BADPARAM');
      DISP_CHANGE_FAILED: ShowMessage('DISP_CHANGE_FAILED');
      DISP_CHANGE_NOTUPDATED: ShowMessage('DISP_CHANGE_NOTUPDATED');
      DISP_CHANGE_RESTART: ShowMessage('DISP_CHANGE_RESTART');
    end;
end;
Ich wäre euch sehr verbunden, wenn einer von Euch mir einen funktionierenden Quellcode hier posten könnte.

Vielen Dank

ddcool

SirThornberry 30. Nov 2007 10:38

Re: Bildschirm drehen
 
als erstes fällt mir auf das du gar nicht prüfst ob EnumDisplaySettings erfolgreich ist. Und zum anderen glaube ich das nicht jede Grafikkarte dies beherscht.

ddcool 30. Nov 2007 10:42

Re: Bildschirm drehen
 
Jo ersteres ist richtig. Ist ja aber auch nur einer von vielen Quelltexten die ich erfolglos probiert habe.
Zweiteres ist mir auch klar jedoch habe ich ein Gerät welches diese Funktion unterstützt. Andere Programme im Netz machen das auch einwandfrei, nur die sind ja leider nicht OpenSource. Ich möchte diese Funktion jedoch aus einem eingenen Programm aus starten, weil 1. Muss das ganze nachher auf 300 Rechner passieren und was mit einem Kostenpflichtigen Programm aus dem Internet nur mit viel Aufwand auf die 300 Geräte gebracht werden kann und 2. würden die Lizenzen für so ein Programm zu teuer werden => Selber proggen

SirThornberry 30. Nov 2007 10:45

Re: Bildschirm drehen
 
welche Fehlermeldung bekommst du beim setzen?
Bei ChangeDisplaySettings im MSDN finde ich nirgends DM_DISPLAYORIENTATION
Folglich würde ich behaupten das es über diese Funktion wohl nicht funktioniert.

Und bei EnumDisplaySettings solltest du ENUM_CURRENT_SETTINGS übergeben.

ddcool 30. Nov 2007 11:11

Re: Bildschirm drehen
 
Das ist es ja ich bekomme gar keine Fehlermeldung.
Alle deine Beispiele habe ich bereits ausprobiert, leider ohne erfolg.
Vielleicht hat ja jemand schon einen funktionierenden Quelltext auf seinem Rechner, den er mir zur Verfügung stellen kann.

SirThornberry 30. Nov 2007 14:05

Re: Bildschirm drehen
 
ich denke mit den obigen funktionen wird es nicht funktionieren denn diese beachten eben die orientation nicht (zumindest laut msdn)

ddcool 3. Dez 2007 08:31

Re: Bildschirm drehen
 
Tja ich habe leider in der MSDN auch nichts brauchbares gefunden. Immer nur für WinCE.
Vielleicht hat hier ja schon jemand mal so einen Code geschrieben oder in seinem Code-Archiv. Wäre echt klasse.

Danke ddcool

ddcool 3. Dez 2007 13:43

Re: Bildschirm drehen
 
Also ich habe jetzt mal das Samsung Tool "MagicRotate" ausprobiert. Funktioniert klasse. Es scheint Windows einfach vorzugaukeln, dass Monitor und Grafikkarte diese Auflösung unterstützen. Wie genau es dieses Tool macht weiss ich nicht, aber vll weiss ja jemand wie man Windows sowas vorgaukelt.

SirThornberry 3. Dez 2007 13:58

Re: Bildschirm drehen
 
Du könntest ja mal bei der Firma anfragen welche Api-Funktion verwendet wird.

ddcool 3. Dez 2007 14:11

Re: Bildschirm drehen
 
Schon gemacht. Antwort (auf deutsch übersetzt): Es tut uns leid aber wir sind nicht befugt Ihnen darüber auskunft zu geben.

ddcool 5. Dez 2007 12:09

Re: Bildschirm drehen
 
Also ich habe jetzt selber noch was über MagicRotate in Erfahrung gebracht. Das Programm arbeitet mit Hooks und einem Treiber. Nur welche Hooks das sind kann ich nicht sagen. Den treiber kann man ja einfach installieren nur der Zugriff auf dessen Funktionen bzw auf die Hooks kenne ich leider nicht und weiss auch nicht wie ich die herausfinde.

SirThornberry 5. Dez 2007 12:28

Re: Bildschirm drehen
 
oh, wenn Treiber im Spiel sind siehts schlecht aus, zumal du die eventuell nicht verwenden darfst für deine Programme.
Ich könnte mir bezüglich des Treibers vorstellen das dieser eine Zwischenschicht zwischen dem Betriebssystem und dem richtigen Grafiktreiber ist.

bitsetter 5. Dez 2007 18:04

Re: Bildschirm drehen
 
Und warum verlinkst du nicht dein Crossposting im Delphi-Forum?

SirThornberry 5. Dez 2007 18:59

Re: Bildschirm drehen
 
Zitat:

Zitat von bitsetter
Und warum verlinkst du nicht dein Crossposting im Delphi-Forum? :warn:

Vielleicht weiß er nicht das so etwas üblich ist und auch gern gesehen ist :) Bitte nicht immer gleich mit dem erhobenen Zeigefinger los gehen, freundliche Worte bewirken meist deutlich mehr.

ddcool 6. Dez 2007 07:11

Re: Bildschirm drehen
 
Zitat:

Zitat von bitsetter
Und warum verlinkst du nicht dein Crossposting im Delphi-Forum?

Wenn du dir den Forumeintrag durchgelesen hättest, wüsstest du, dass ich darauf bereits aufmerksam gemacht worden bin und in meinem ersten Post ein Edit mit folgenem Text besteht :-D :

Oh, ja sorry existiert bereits ein Forumeintrag im anderen Forum.
www.delphipraxis.net...ldschirm+drehen.html

Jedoch kann ich hier meinen Post nicht mehr ändern und außerdem stehen im Delphi-Forum bis jetzt eh keine nennenswerten Informationen. Post wird dort sowie auch hier eh bald geschlossen, da es leider keinen gibt, der sich mit der Materie auskennt.

SirThornberry 6. Dez 2007 07:43

Re: Bildschirm drehen
 
ich denke es hat weniger mit auskennen als viel mehr damit zu tun das Delphi und Treiberprogrammierung nicht zusammen passt. Du musst auch keine Angst haben das dieses Thema geschlossen wird aufgrund von keiner Antwort. Der Beitrag bleibt weiterhin bestehen so das auch in einigen Monaten noch die Lösung gepostet werden kann. :)

ddcool 6. Dez 2007 07:51

Re: Bildschirm drehen
 
Jopp, okay denn halt so. :-D Es ist halt nur so ich habe mich jetzt echt übertrieben viel mit der MSDN und sämtlichen Foren beschäftigt um eine Lösung zu finden. Leider ohne Erfolg. Ich bin nur immer wieder auf die Option dmDisplayOrientation gestoßen, die es ab XP geben soll. Jedoch bietet mir mein Delphi 2007 SP3 diese Funktion nicht an, es gibt nur die Druckervariante dmOrientation.
Vielleicht gibt es hier ja auch einige klevere Debugger, die sich mal das MagicRotate vornehmen und gucken, wie und mit welchen befehlen der Treiber davon angesprochen wird, weil die eigentliche Anwendung kommuniziert ja mir dem Treiber. Den Treiber zu installieren und nen paar Dlls zu registrieren habe ich schon hinbekommen, jedoch das ausleden der relevanten Funktionen bekomme ich nicht hin.

bitsetter 6. Dez 2007 11:11

Re: Bildschirm drehen
 
Zitat:

Zitat von ddcool
Es ist halt nur so ich habe mich jetzt echt übertrieben viel mit der MSDN und sämtlichen Foren beschäftigt um eine Lösung zu finden. Leider ohne Erfolg. Ich bin nur immer wieder auf die Option dmDisplayOrientation gestoßen, die es ab XP geben soll. Jedoch bietet mir mein Delphi 2007 SP3 diese Funktion nicht an, es gibt nur die Druckervariante dmOrientation.

Der C++ Builder Explorer bietet anscheinend jedoch diese Funktion an:
Code:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
DEVMODEA DM;
DISPLAY_DEVICEA DD;

   ZeroMemory(&DD, sizeof(DD));
   DD.cb = sizeof(DD);
   if (0 != EnumDisplayDevices(0, 0, &DD, 0))
   {
      Caption = DD.DeviceName;

      ZeroMemory(&DM, sizeof(DM));
      DM.dmSize = sizeof(DM);
      if (0 != EnumDisplaySettings(DD.DeviceName, ENUM_CURRENT_SETTINGS, &DM))
      {
         DM.dmFields = DM_PELSWIDTH + DM_PELSHEIGHT + DM_DISPLAYORIENTATION;//?

         DM.dmDisplayOrientation = DMDO_180;//DMDO_DEFAULT;
         DM.dmPelsWidth= 1024;
         DM.dmPelsHeight= 768;

         switch(ChangeDisplaySettings(&DM,CDS_UPDATEREGISTRY))
         {
         case DISP_CHANGE_SUCCESSFUL:
            MessageBox(NULL, "DISP_CHANGE_SUCCESSFUL", "Hinweis", MB_OK);
            break;
         case DISP_CHANGE_BADFLAGS:
            MessageBox(NULL, "DISP_CHANGE_BADFLAGS", "Hinweis", MB_OK);
            break;
         case DISP_CHANGE_BADMODE:
            MessageBox(NULL, "DISP_CHANGE_BADMODE", "Hinweis", MB_OK);
            break;
         case DISP_CHANGE_BADPARAM:
            MessageBox(NULL, "DISP_CHANGE_BADPARAM", "Hinweis", MB_OK);
            break;
         case DISP_CHANGE_FAILED:
            MessageBox(NULL, "DISP_CHANGE_FAILED", "Hinweis", MB_OK);
            break;
         case DISP_CHANGE_NOTUPDATED:
            MessageBox(NULL, "DISP_CHANGE_NOTUPDATED", "Hinweis", MB_OK);
            break;
         case DISP_CHANGE_RESTART:
            MessageBox(NULL, "DISP_CHANGE_RESTART", "Hinweis", MB_OK);
            break;
         }
      }
   }
}
Sowie ich
Code:
DM.dmDisplayOrientation
auf DMDO_180 (= 2) setze kommt die Meldung DISP_CHANGE_BADMODE, bei DMDO_DEFAULT (= 0) DISP_CHANGE_SUCCESSFUL.
Mein Treiber unterstützt eigentlich das Drehen des Bildschirms.

Muetze1 6. Dez 2007 18:19

Re: Bildschirm drehen
 
Zitat:

Zitat von bitsetter
Sowie ich
Code:
DM.dmDisplayOrientation
auf DMDO_180 (= 2) setze kommt die Meldung DISP_CHANGE_BADMODE, bei DMDO_DEFAULT (= 0) DISP_CHANGE_SUCCESSFUL.
Mein Treiber unterstützt eigentlich das Drehen des Bildschirms.

Meiner auch, aber ich bekomme immer bei einer Orientation <> 0 ein BADMODE als Result. Von daher habe ich auch keine Lösung bzw. mich nicht weiter hier gemeldet.

Und kann dein Treiber wirklich den Schirm um 180° drehen? Also einmal auf den Kopf stellen? Meiner kann nur 90° und 270°

bitsetter 6. Dez 2007 19:03

Re: Bildschirm drehen
 
Zitat:

Zitat von Muetze1
Zitat:

Zitat von bitsetter
Sowie ich
Code:
DM.dmDisplayOrientation
auf DMDO_180 (= 2) setze kommt die Meldung DISP_CHANGE_BADMODE, bei DMDO_DEFAULT (= 0) DISP_CHANGE_SUCCESSFUL.
Mein Treiber unterstützt eigentlich das Drehen des Bildschirms.

Meiner auch, aber ich bekomme immer bei einer Orientation <> 0 ein BADMODE als Result. Von daher habe ich auch keine Lösung bzw. mich nicht weiter hier gemeldet.

Und kann dein Treiber wirklich den Schirm um 180° drehen? Also einmal auf den Kopf stellen? Meiner kann nur 90° und 270°

Ja mithilfe des Treibers lässt sich der Schirm bei mir problemlos auf den Kopf stellen, ich habe natürlich auch noch andere Variationen versucht es brachte alles nicht.


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