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 3  1 23      
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

Multi-Monitor-Umgebung: Bestimmten Monitor abschalten

  Alt 17. Dez 2012, 07:55
Hallo!

Also ich such jetzt schon zwei Tage aber finden kann ich zu diesem Problem nichts: Wie kann man in einer Multi-Monitor-Umgebung einen bestimmten Monitor (eben NICHT alle zusammen) in den Standby schicken.

Lösungen wie diese:SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2); findet man zu Hauf im Netz, aber das schickt bestenfalls nur alle Monitore gemeinsam in den Standby, nicht einen bestimmten.

Möglicherweise kann das Windows auch von der Logik her nicht, da jede Mausbewegung oder Tastendruck eigentlich die Bildschirme wieder aufweckt. Dann wäre es schlicht unmöglich, einen von mehreren Bildschirmen in den Standby zu schicken und an dem/den anderen weiter zu arbeiten.

Vielleicht gehts aber doch und einer von euch hat eine Idee?

Grüße
Cody
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#2

AW: Multi-Monitor-Umgebung: Bestimmten Monitor abschalten

  Alt 17. Dez 2012, 08:35
Da ich ähnliches denke, was du schon befürchtest, würde ich eher danach gucken, wie man einen Bildschirm aus der Konfiguration entfernen kann. Quasi so, als würde man in der Systemsteuerung "Diesen Monitor verwenden" abschalten. Ggf. gibt es da einen Weg via WMI o.ä.

Nur Standby hätte auch den unschönen Nebeneffekt, dass der Moni dann ja logisch noch vorhanden wäre, sich Windows also nicht wie mit nur einem verhält. Das führt gerne mal zu "verlorenen" Fenstern und Desktop-Icons die man nicht mehr findet.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Multi-Monitor-Umgebung: Bestimmten Monitor abschalten

  Alt 17. Dez 2012, 14:41
Das logische Entfernen bzw. logische Deaktivieren kann aber auch unschöne Seiteneffekte haben. Dann werden evtl. auf dem Desktop platzierte Icons verschoben oder diverse Window Geometrics "sabotiert". Hat schon mal jemand gesehen was die Delphi-7-IDE unter Windows 7 für eine Show veranstaltet, wenn man die Auflösung ändert? Das sieht dann aus als würde sie im Schneckentempo Amok laufen.

Ich denke ich werde das erstmal bleiben lassen mit dem gezielten Abschalten einzelner Monitore. Braucht man einen Blackscreen kann man zur Not ein rahmenloses schwarzes Fenster StayOnTop da hinstellen.

Der Gedanke dahinter war eine Rechner-Bildschirm-Beamer-Konfiguration, wobei der Beamer nicht wie üblich den Desktop spiegelt sondern Teil des Desktops ist. Das Bild über den Beamer wird dann erst "hell" wenn der Anwender es will. So er vorher noch etwas auf dem Rechner zu tun hat das nicht alle über den Beamer sehen sollen. Das kann dann von Nutzen sein wenn der Beamer nicht gleich neben dem Rechner steht und man auch keine Fernbedienung hat (z.B. bei Präsentationen an fremden Beamern).
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
343 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Multi-Monitor-Umgebung: Bestimmten Monitor abschalten

  Alt 17. Dez 2012, 20:02
Soweit ich weiß, gibt es bei einigen Beamern eine serielle Schnittstele, wo man den Beamer steuern kann. Vielleicht kann man über diese Schnittstelle, falls vorhanden, den Beamer mal auf Standby schalten.

Lg,
jus
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#5

AW: Multi-Monitor-Umgebung: Bestimmten Monitor abschalten

  Alt 17. Dez 2012, 23:09
Der Gedanke dahinter war eine Rechner-Bildschirm-Beamer-Konfiguration, wobei der Beamer nicht wie üblich den Desktop spiegelt sondern Teil des Desktops ist. Das Bild über den Beamer wird dann erst "hell" wenn der Anwender es will. So er vorher noch etwas auf dem Rechner zu tun hat das nicht alle über den Beamer sehen sollen. Das kann dann von Nutzen sein wenn der Beamer nicht gleich neben dem Rechner steht und man auch keine Fernbedienung hat (z.B. bei Präsentationen an fremden Beamern).
Hmmm ... man kann doch den Desktop erweitern? (Shortcut Win+P)
Damit kann man erstmal sein zeug machen (über den beamer sieht man dann nur den Desktophintergrund) und wenn man loslegen möchte das Fenster nach rechts verschieben und loslegen. Powerpoint erkennt den Beamer vll. sogar selbst so dass die Präsentation direkt dort startet.
  Mit Zitat antworten Zitat
Benutzerbild von Christoph Schneider
Christoph Schneider

Registriert seit: 7. Okt 2008
Ort: CH-Baar
54 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Multi-Monitor-Umgebung: Bestimmten Monitor abschalten

  Alt 18. Dez 2012, 07:22
Windows kann diese Aufgabenstellung nicht vernünftig lösen.
Ich würde in dieser Situation mit einer schaltbaren Stromschiene (bspw. per RS232) die Stromversorgung des Monitors ein-/ausschalten.
Christoph Schneider
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

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

AW: Multi-Monitor-Umgebung: Bestimmten Monitor abschalten

  Alt 18. Dez 2012, 07:43
Ich denke auch, dass das der Weg ist.

Einfach mal schauen ob der Beamer eine serielle Schnittstelle hat und ob man das Protokoll in die Finger bekommt. Neuere Modelle, die keine Serielle Schnittstelle mehr haben lassen sich oftmals auch per LAN (soweit vorhanden) bedienen. Auch hier braucht man Zugriff auf das Protokoll wenn man nicht zu viel reverse engeneering betreiben will.

Nachteil diese Lösung ist ganz klar, dass ein anderer beamer andere Schnittstellen hat und ein anderes Protokoll fährt. Ein wenig flexibler wäre man mit einer WinLIRC-Lösung. Hier bräuchte dann nur jeweils der Fernbedienungscode für Ein/Aus angelernt werden. Code gibts zu Hauf im Netz.

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 Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#8

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
 
#9

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, 33x aufgerufen)
Dateityp: pas pmSingleton.pas (4,8 KB, 28x 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
 
#10

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
Antwort Antwort
Seite 1 von 3  1 23      


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 20:44 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