Autor Beitrag
vermis-one
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 25

Win XP
VB.NET/C# VS2008express, XNA3.0 CTP
BeitragVerfasst: Mo 17.03.08 10:48 
Hallöchen zusammen :wink2:

Da die Windows-eigenen Mechanismen immer wieder versagen oder andere Programme diese anscheinend behindern, suche ich eine Möglichkeit den Monitor per Programmbefehl in den StandBy zu schicken - optimal wäre natürlich wenn es in c# ginge. Leider hat meine bisherige Suche nicht viel ergeben, oder Tools zutage getragen die nur durch expliziten Aufruf/Klick den Monitor schlafen schicken, jedoch nicht automatisch beispielsweise nach nem Timer-Ereignis.

Kurz und bündig: Gibt es in C# eine Möglichkeit Zugriff auf den Monitor zu erlangen und diesen in den StandBy zu schicken ?


Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Mo 17.03.2008 um 09:54

_________________
Vor dem Zweiten Weltkrieg war das Leben einfach, danach gab es Computer. Grace Hopper
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 17.03.08 11:55 
Naja, was hast du denn bisher gefunden? Das wird zu 99% durch P/Invoke auch auf C# übertragbar sein.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 17.03.08 11:56 
Du könntest doch mittels "Process.Start(...)" eines der externen Tools aufrufen.

Hast du denn eine (WinAPI)-Funktion ermitteln können, welche das macht? Dann könntest du diese mittels "[DllImport]" in C# einbinden.
vermis-one Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 25

Win XP
VB.NET/C# VS2008express, XNA3.0 CTP
BeitragVerfasst: Mo 17.03.08 14:06 
user profile iconKhabarakh hat folgendes geschrieben:
Das wird zu 99% durch P/Invoke auch auf C# übertragbar sein.

Mit P/Invoke hab ich mich bisher noch nicht auseinander gesetzt. Wüsste daher nicht nach was ich genau suchen sollte, damit ich das verwenden könnte.

user profile iconTh69 hat folgendes geschrieben:
Du könntest doch mittels "Process.Start(...)" eines der externen Tools aufrufen.

Die bisherigen Tools hatten keine Kommandozeilenfunktionen, sondern mussten angeklickt werden. Hab aber grade eines gefunden das sich per Kommandozeile steuern lässt - da denke ich würde Process.Start tatsächlich gehen. Das probier ich heut abend aus.

user profile iconTh69 hat folgendes geschrieben:

Hast du denn eine (WinAPI)-Funktion ermitteln können, welche das macht? Dann könntest du diese mittels "[DllImport]" in C# einbinden.

Soweit ich mich entsinne - ist in Windows die Powrprof.dll für´s PowerManagement zuständig. Allerdings habe ich lediglich Beispiele gefunden, die den ganzen PC in den Ruhezustand bzw. StandBy schicken. Zum MonitorStandBy hab ich bis jetzt in der zugehörigen MSDN-Referenz auch nichts gefunden.
msdn2.microsoft.com/...aa373170(VS.85).aspx



Allerdings hatte ich gehofft, dass es bereits eine .net-framework-interne Lösung gibt, um nicht "gezwungen" zu sein, externe Tools oder DLLs verwenden zu müssen.

_________________
Vor dem Zweiten Weltkrieg war das Leben einfach, danach gab es Computer. Grace Hopper
mutterholzbein
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 47
Erhaltene Danke: 1

[Win XP pro,Win 7pro, Ubuntu 10.04]
[MS Visual Studio 2008 pro TeamSystem,VS-2010-Ultimate [C, C++ (u.a. mit QT4), C#, PHP]
BeitragVerfasst: Mo 17.03.08 14:44 
Titel: re: Monitor...Standby
hallo user profile iconvermis-one,

vielleicht hilft dir das etwas weiter:

wwwspies.informatik....t_csharp/Folie07.pdf
(ist leider keine komplette anleitung, aber doch ein denkanstoß)
oder:
www.galileocomputing...arp_11_002.htm#t2t33
(auch nur ein denkanstoß)
oder:
www.primetime-softwa...,Multithreading.aspx
(relativ gut beschrieben, aber wie der rest nur anstösse und keine kompletten tutorien)
oder:
msdn2.microsoft.com/...1c9txz50(VS.80).aspx
(die [url]-tags funktionieren nicht bei diesem link. :gruebel: )
^^ code-ausschnitt:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
...
if (Monitor.TryEnter(this300)) {
    try {
        // Place code protected by the Monitor here.
    }
    finally {
        Monitor.Exit(this);
    }
}
else {
    // Code to execute if the attempt times out.
}
...

...

habe auch im netz mal ein wenig gesucht aber leider auch nix richtiges für dich gefunden...

vielleicht solltest du dich mal mit der hersteller-eigenen (vom monitor) lösung beschäftigen (sprich: finde heraus ob es zu der mitgelieferten dll eine doku gibt). allerdings bezieht sich die lösung dann nur auf diesen hersteller. also keine allaround-lösung für dein priggi.

so, ich suche noch ein bissl weiter und editiere den beitrag, sobald ich was für dich sinnvolles finde...:wave:

greetz, mhb
vermis-one Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 25

Win XP
VB.NET/C# VS2008express, XNA3.0 CTP
BeitragVerfasst: Mo 17.03.08 16:12 
Titel: Re: re: Monitor...Standby
Danke für die Links. Aber soweit ich das sehe (habs nur überflogen) beziehen sich diese auf die Monitor-Klasse im Framework - die hat aber mehr mit Threading denn mit Monitoren zu tun.

Stop mal :shock: - kann es sein das ihr das falsch verstanden habt ? Falls ja, dann sorry - ich meinte eigentlich den Bildschirm und dessen Stromsparmodus.

_________________
Vor dem Zweiten Weltkrieg war das Leben einfach, danach gab es Computer. Grace Hopper
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 17.03.08 16:55 
Hast du das hier schon einmal ausprobiert? Erster Link in Google.

@mutterholzbein: Mir fehlen die Worte :lol: .
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 17.03.08 17:21 
Hi, ich habe dich schon richtig verstanden -)

Der WinAPI-Befehl in C/C++ sieht so aus:
ausblenden Quelltext
1:
2:
3:
4:
5:
const int display_low_power = 1;
const int display_shut_off  = 2;

HWND handle=GetDesktopWindow();
PostMessage(handle, WM_SYSCOMMAND, SC_MONITORPOWER, display_low_power); // oder display_shut_off


Jetzt nur noch in C# umsetzen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
using System.Runtime.InteropServices

public class Win
{
  [DllImport("user32.dll")]
  private static extern int PostMessage (IntPtr hWnd, int wMsg, IntPtr wParam, int lParam);

  [DllImport("user32.dll")]
  private static extern IntPtr GetDesktopWindow ();

  static void DisplayOff()
  {
    const int display_low_power = 1;
    const int display_shut_off  = 2;

    const int WM_SYSCOMMAND = 0x0112// aus WinUser.h
    const int SC_MONITORPOWER = 0xF170// aus WinUser.h
    IntPtr handle = GetDesktopWindow();
    PostMessage(handle, WM_SYSCOMMAND, new IntPtr(SC_MONITORPOWER), display_low_power); // oder display_shut_off
  }
}

Ist ungetestet, aber schau mal, ob du es damit hinbekommst... und schreib zurück -)
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 17.03.08 19:25 
Wenn ich das mit obigem Artikel vergleiche, solltest du lParam wohl auch als IntPtr deklarieren, sonst dürfte es auf 64-Bit Ärger geben.
vermis-one Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 25

Win XP
VB.NET/C# VS2008express, XNA3.0 CTP
BeitragVerfasst: Mo 17.03.08 20:34 
user profile iconKhabarakh hat folgendes geschrieben:
Hast du das hier schon einmal ausprobiert? Erster Link in Google.

Bei mir hat Google andere Ergebnisse ausgespuckt - hab wohl andere Begriffe genommen. Über die Seite bin ich zumindest nicht gestolpert.

Aber das ist perfekt. Es funktioniert genauso wie ich mir das vorstellte.

Der Code sieht dann etwa so aus:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
using System.Runtime.InteropServices;

[DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);  

internal void DisplayOff_SendMessage()
{
        const int display_low_power = 1;
        const int display_shut_off  = 2;

        const int WM_SYSCOMMAND = 0x0112;
        const int SC_MONITORPOWER = 0xF170
  
        SendMessage(this.Handle, WM_SYSCOMMAND, new IntPtr(SC_MONITORPOWER), new IntPtr((display_shut_off)));
}


mit PostMessage wie in Th69´s Bespiel funktionierts auch, man muss lediglich das "static"-Schlüsselwort aus der der DisplayOff()-Methodendefinition rausnehmen und das "handle" durch this.Handle ersetzen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
using System.Runtime.InteropServices; 

[DllImport("user32.dll")]
static extern int PostMessage (IntPtr hWnd, int wMsg, IntPtr wParam, int lParam);

internal void DisplayOff_PostMessage()
{
    const int display_low_power = 1;
    const int display_shut_off  = 2;

    const int WM_SYSCOMMAND = 0x0112;
    const int SC_MONITORPOWER = 0xF170
    
    PostMessage(this.Handle, WM_SYSCOMMAND, new IntPtr(SC_MONITORPOWER), display_shut_off);
}


Ich denke damit wäre mein "Problem" gelöst.
Danke für die Antworten.

_________________
Vor dem Zweiten Weltkrieg war das Leben einfach, danach gab es Computer. Grace Hopper