AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Multi-Monitor-Umgebung: Bestimmten Monitor abschalten
Thema durchsuchen
Ansicht
Themen-Optionen

Multi-Monitor-Umgebung: Bestimmten Monitor abschalten

Ein Thema von Codehunter · begonnen am 17. Dez 2012 · letzter Beitrag vom 8. Jan 2013
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.291 Beiträge
 
Delphi 12 Athens
 
#1

AW: Multi-Monitor-Umgebung: Bestimmten Monitor abschalten

  Alt 18. Dez 2012, 16:04
Win-P ist nichts was man programmatisch nutzen könnte, außerdem hat es die selben negativen Seiteneffekte wie schon beschrieben (Icon-Schubserei)

Das mit der seriellen Schnittstelle ist nicht unbedingt das Mittel der Wahl da das immer proprietär ist. Na vielleicht fällt mir ja noch was Gescheites ein
  Mit Zitat antworten Zitat
Meta777

Registriert seit: 8. Sep 2004
Ort: Magdeburg
248 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Multi-Monitor-Umgebung: Bestimmten Monitor abschalten

  Alt 18. Dez 2012, 21:41
Ahoi,

mittels DDC/CI geht dies wohl am besten (vorausgesetzt die Monitore unterstützen es). Ich hatte mal irgendwo ein Testproject, wenn ich das finde häng ich es an.

hth

ACHTUNG: Der Code kann die Monintoreinstellungen zu unbrauchbaren Werten hin ändern. Prüfe ggf. vorher ob du deinen Monitor über das OSD zurücksetzen kannst. Zum Factory Reset über den Source verwende die im "VESA Monitor Control Command Set" (Tabelle 8.1) definierten Codes.


Shalom

EDIT: Units hinzugefügt (TPmMoniControl ist als Singleton implementiert, deswegen hab ich auch die Singleton unit angefügt [die es hier auch im Forum geben müsste]). Das Ganze war wie gesagt ein Testproject und erhebt kein Anspruch auf Vollständigkeit ABER man konnte einzelne Monitor abschalten.

Verwendungsbeispiel:
die Methode "actToggleMoniPower" wird einer Action zugewiesen. Im "Tag"-Property der Action muss die Monitornummer stehen. Auf dem Form sind eine TListBox, eine TTreeView und um Codes zu senden eine TEdit und ein Button.

Delphi-Quellcode:
function EnumDisplayMonitorsCallback(hm: HMONITOR; dc: HDC; r: PRect; l: LPARAM): Boolean; stdcall;
//Callback für Auflistung aller Monitore

  function RectToStr: String;
  begin
    Result := Format('%d-%d %d|%d', [r.Left, r.Right, r.Top, r.Bottom]);
  end;

begin
  Form1.lbMonitorsAvailabe.AddItem(RectToStr, TObject(hm));
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  EnumDisplayMonitors(0, nil, EnumDisplayMonitorsCallback, 0);
end;

procedure TForm1.lbMonitorsAvailabeClick(Sender: TObject);
begin
  //Vom Monitor unterstützte Codes ermitteln...
  TPmMoniControl.GetVCPCodesAvailable(HMONITOR(lbMonitorsAvailabe.Items.Objects[
    lbMonitorsAvailabe.ItemIndex]));
  Assign(TPmMoniControl.ReqInstance);
end;

procedure TForm1.Assign(ASource: TPersistent);
var
  i: Integer;
  LLastNodeAdded: TTreeNode;

  procedure AddChilds(AParent: TTreeNode; AValues: TStrings);
  var
    i: Integer;
  begin
    for i := 0 to AValues.Count-1 do
      tvCodes.Items.AddChild(AParent, AValues[i]);
  end;

begin
  if (ASource <> nil) AND (ASource.InheritsFrom(TPmMoniControl)) then
  begin
    tvCodes.Items.Clear;
    for i := 0 to TPmMoniControl(ASource).CodesAvailable.Count-1 do
    begin
      LLastNodeAdded := tvCodes.Items.AddChild(nil,
        TPmMoniControl(ASource).CodesAvailable[i]);
      if TPmMoniControl(ASource).CodesAvailable.Objects[i] <> nil then
        AddChilds(LLastNodeAdded,
          TStrings(TPmMoniControl(ASource).CodesAvailable.Objects[i]));
    end;//for i := 0 to TPmMoniControl(ASource).CodesAvailable.Count-1 do
  end else
    inherited;
end;

procedure TForm1.btnSendClick(Sender: TObject);
var
  LVCPCode: Byte;
  LData: DWORD;
begin
  LVCPCode := StrToInt('$' + tvCodes.Selected.Text);
  LData := StrToInt(eValue.Text);
  if not TPmMoniControl.Send(LVCPCode, LData) then
    RaiseLastOSError;
end;

procedure TForm1.actToggleMoniPower(Sender: TObject);
const
  //although we assume that the monitor is powered on by default we store the
  //value visa versa for simplicity (so we do not need to set the initial
  //powerstate to True [1] in the actions .Tag-property)
  konPowerValue: Array[Boolean] of Byte = (1, 4);
var
  LMoniNumber, LPowerState: Byte;
begin
  //the Monitor number is set in the .Tag property at designtime!
  LMoniNumber := Lo(TAction(Sender).Tag);
  //In the High-Byte we store the power state - get it here
  LPowerState := Hi(TAction(Sender).Tag);
  //at least the monitor should be "detected"
  Assert(lbMonitorsAvailabe.Items.Count >= LMoniNumber);
  //toogle the the powerstate - if it's True (1) set to False (0) and visa versa
  LPowerState := Ord(NOT Boolean(LPowerState));
  //Get VCP Codes via the HMonitor handle
  TPmMoniControl.GetVCPCodesAvailable(HMonitor(
    lbMonitorsAvailabe.Items.Objects[LMoniNumber-1]));
  //Send new power state value
  TPmMoniControl.Send($D6, konPowerValue[Boolean(LPowerState)]);
  //Save the new power state if it could be send to the monitor
  TAction(Sender).Tag := MakeWord(LMoniNumber, LPowerState);
end;
Angehängte Dateien
Dateityp: pas pmMoniControl.pas (5,5 KB, 35x aufgerufen)
Dateityp: pas pmSingleton.pas (4,8 KB, 30x aufgerufen)

Geändert von mkinzler (20. Dez 2012 um 08:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#3

AW: Multi-Monitor-Umgebung: Bestimmten Monitor abschalten

  Alt 19. Dez 2012, 08:10
Ich muss vor dem oben stehenden Code warnen. Er ist unvollständig. Bei dem Versuch herauszufinden wie er funktioniert hab ich auf meinem ersten Monitor, wie es scheint, den Gamma-Wert so hoch geschraubt, dass er beinahe nur noch weiss ist und mein zweiter Monitor ist rosa eingefärbt.

Wie stellt man auf default zurück?

Toni
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.474 Beiträge
 
Delphi 12 Athens
 
#4

AW: Multi-Monitor-Umgebung: Bestimmten Monitor abschalten

  Alt 19. Dez 2012, 08:13
Spontan würde ich sagen über das monitoreigene Menü... (ausnahmsweise per Hand)
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#5

AW: Multi-Monitor-Umgebung: Bestimmten Monitor abschalten

  Alt 19. Dez 2012, 08:18
Der kann nur Helligkeit und Kontrast. Reset setzt zwar diese Einstellungen zurück aber ändert nichts an der Farbe.

Habs mit Try & Error über das Programm wieder brauchbar bekommen... Auch wenn ich das gefühl hab der Eine tut jetzt in den Augen weh. Muss vielleicht noch mal mit dem Kontrast herumspielen.

Scheint als hätte der Monitor-Hersteller am OSD gespart.
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.474 Beiträge
 
Delphi 12 Athens
 
#6

AW: Multi-Monitor-Umgebung: Bestimmten Monitor abschalten

  Alt 19. Dez 2012, 08:20
Dann hätten wir noch in den Anzeigeeinstellungen "Farbkalibrierung". Das ist eine Art Wizzard... (W7)
  Mit Zitat antworten Zitat
Meta777

Registriert seit: 8. Sep 2004
Ort: Magdeburg
248 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Multi-Monitor-Umgebung: Bestimmten Monitor abschalten

  Alt 20. Dez 2012, 08:55
Ich muss vor dem oben stehenden Code warnen. Er ist unvollständig. Bei dem Versuch herauszufinden wie er funktioniert hab ich auf meinem ersten Monitor, wie es scheint, den Gamma-Wert so hoch geschraubt, dass er beinahe nur noch weiss ist und mein zweiter Monitor ist rosa eingefärbt.

Wie stellt man auf default zurück?

Toni
Sorry Tonic1024,

falls du es nicht schon gefunden hast kannst du mit den Factory Reset Codes aus der Tabelle 8.1 des Bei Google suchenVESA Monitor Control Command Set die Einstellungen wieder reseten. Ich habe auch mal die Mods informiert, dass Sie eine Warnung in meinen Beitrag schrieben (Selbst bearbeiten kann ich ihn nicht mehr).

Shalom
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#8

AW: Multi-Monitor-Umgebung: Bestimmten Monitor abschalten

  Alt 20. Dez 2012, 09:12
Kein Beinbruch... Man muss sich nur im klaren sein was man tut wenn man blindlinks Messages durch die Gegend Feuert.
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.291 Beiträge
 
Delphi 12 Athens
 
#9

AW: Multi-Monitor-Umgebung: Bestimmten Monitor abschalten

  Alt 20. Dez 2012, 10:43
So, neue Version, neues Glück:

Wenn man jetzt den Reiter "VESA MCCS" anklickt hat man die Power-Buttons (aufpassen, dass man nicht den abschaltet wo man das Fenster vom Testprogramm hat) und exemplarisch einen Regler für die Helligkeit. Wenn man den verschiebt und anschließend mal im OSD des Monitors nachschaut, dann ändert man mit dem Regler wirklich die Monitoreinstellungen, nicht die von der Grafikkarte. Man sollte sich aber ggf. vorher den eingestellten Wert merken, damit man ihn hinterher per OSD wieder genauso einstellen kann. Die Trackbar ist ja nur ein Schätzeisen.

Der Helligkeitsregler steht nur stellvertretend für eine ganze Reihe von Optionen, die von VESA MCCS unterstützt werden. Es hängt aber auch davon ab, welches Subset davon von der Monitor-Firmware unterstützt wird.

Wichtig: Die V4 unterstützt Windows XP nicht mehr!
Angehängte Dateien
Dateityp: zip Multimon_V4.zip (304,4 KB, 64x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#10

AW: Multi-Monitor-Umgebung: Bestimmten Monitor abschalten

  Alt 20. Dez 2012, 11:10
Wenn ich einen Monitor auswähle bekomme ich eine AV. Helligkeit lässt sich danach regeln. Monitorpower klappt nicht. Keine Meldung, keine Reaktion.

Gruß,

Toni
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:13 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