Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Monitor abschalten bei Fernwartung (TeamViewer)?

958 views
Skip to first unread message

Johannes Eble

unread,
Apr 27, 2010, 1:53:30 PM4/27/10
to
Hallo allerseits,

gibt es eine Möglichkeit (.NET oder auch Win32), den Monitor über die
Fernwartung schwarz zu schalten?

Ich muss einen WinXP Touchpanel-PC über die Fernwartung schwarz
schalten lassen, damit vor Ort nicht beobachtet werden kann, was
geschieht. Dies ist mir auch fast gelungen mit der Win32-Message

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

const int SC_MONITORPOWER = 0xF170;
const int WM_SYSCOMMAND = 0x0112;

const int MONITOR_ON = -1;
const int MONITOR_OFF = 2;
const int MONITOR_STANBY = 1;
...

SendMessage(ValidHWND.ToInt32(), WM_SYSCOMMAND, SC_MONITORPOWER,
MONITOR_OFF);

Allerdings wird, wenn man zusätzlich über TeamViewer mit dem PanelPC
verbunden ist (was man ja ist, wenn man Fernwartung betreibt), bei
jedem Ruckeln der (Fernwartungs-)Maus der Bildschirm wieder
eingeschalten.

Wie kann ich das unterbinden?

Viele Grüße

Johannes

Jochen Kalmbach [MVP]

unread,
Apr 27, 2010, 3:20:26 PM4/27/10
to
Hallo Johannes!

> Wie kann ich das unterbinden?

while(true)
{
SendMessage...
Thread.Sleep(10)
}

--
Greetings
Jochen

My blog about Win32 and .NET
http://blog.kalmbachnet.de/

Herfried K. Wagner [MVP]

unread,
Apr 27, 2010, 4:46:52 PM4/27/10
to
Hallo Johannes!

Am 27.04.2010 19:53, schrieb Johannes Eble:
> gibt es eine Möglichkeit (.NET oder auch Win32), den Monitor über die
> Fernwartung schwarz zu schalten?
>
> Ich muss einen WinXP Touchpanel-PC über die Fernwartung schwarz
> schalten lassen, damit vor Ort nicht beobachtet werden kann, was
> geschieht. Dies ist mir auch fast gelungen mit der Win32-Message
>
> [DllImport("user32.dll")]
> static extern IntPtr SendMessage(int hWnd, int Msg,
> int wParam, int lParam);

Nebenbei: Zumindest der erste Parameter sollte als 'IntPtr' deklariert sein.

> SendMessage(ValidHWND.ToInt32(),

'ToInt32' weg.

--
M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://dotnet.mvps.org/dotnet/faqs/>

Frank Dzaebel

unread,
Apr 28, 2010, 12:44:34 AM4/28/10
to
Hallo Johannes,

> Allerdings wird, [...] bei jedem Ruckeln der (Fernwartungs-)


> Maus der Bildschirm wieder eingeschalten.
> Wie kann ich das unterbinden?

ansich kann man einen MouseHook benutzen.
Ausserdem würde SetPowerState über WMI
Win32_DesktopMonitor funktionieren, nur
unterstützt nicht jeder Monitor die
PowerManagementCapabilities.

Da eine while-true-Schleife mit ständigem Aktivieren
des SC_MONITOR_OFF unnötig Ressourcen-belastend
für das System ist, kannst Du auch (etwas milder) die
Position des Cursors prüfen.
Also einfach und sauber beispielsweise:

[DllImport("user32.dll")]
static extern IntPtr SendMessage(

IntPtr hWnd, int Msg, int wParam, int lParam);

const int SC_MONITORPOWER = 0xF170;
const int WM_SYSCOMMAND = 0x0112;

const IntPtr HWND_BROADCAST = new IntPtr(0xffff);


const int MONITOR_OFF = 2;

System.Windows.Forms.Timer timerCursor = new Timer();
Point alteCursorPosition;

private void MonitorAus()
{
alteCursorPosition = Cursor.Position;
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND,
SC_MONITORPOWER, MONITOR_OFF);
timerCursor.Enabled = true;
}

private void Form1_Load(object sender, EventArgs e)
{
timerCursor.Interval = 1000;
timerCursor.Tick += TimerCursor_Tick;
}

void TimerCursor_Tick(object sender, EventArgs e)
{
if (Cursor.Position != alteCursorPosition)
{
timerCursor.Enabled = false;
MonitorAus();
}
}


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Frank Dzaebel

unread,
Apr 28, 2010, 1:03:12 AM4/28/10
to
Code noch etwas modifiziert:

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

const int SC_MONITORPOWER = 0xF170;
const int WM_SYSCOMMAND = 0x0112;

IntPtr HWND_BROADCAST = new IntPtr(0xffff);
const int MONITOR_OFF = 2;
System.Windows.Forms.Timer timerCursor = new Timer();
Point alteCursorPosition;

private void MonitorAus()
{
alteCursorPosition = Cursor.Position;
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND,
SC_MONITORPOWER, MONITOR_OFF);
timerCursor.Enabled = true;
}

private void Form1_Load(object sender, EventArgs e)
{

timerCursor.Interval = 100;

Dieter Strassner

unread,
Apr 28, 2010, 7:27:44 AM4/28/10
to
Hallo Johannes,

[..]


> gibt es eine Möglichkeit (.NET oder auch Win32), den Monitor über die
> Fernwartung schwarz zu schalten?
>
> Ich muss einen WinXP Touchpanel-PC über die Fernwartung schwarz
> schalten lassen, damit vor Ort nicht beobachtet werden kann, was
> geschieht. Dies ist mir auch fast gelungen mit der Win32-Message

[...]

Warum benutzt Du nicht die eingebaute Teamviewer-Funlktionalität (Unter
"Extras")?

--

Viele Grüße

Dieter


Rückfragen bitte nur in die Newsgroup!

EDV-Kommunikation Strassner e.K.
68623 Lampertheim
Internet: www.strassner.biz

Johannes Eble

unread,
Apr 29, 2010, 11:59:32 AM4/29/10
to
Hallo Dieter,

On 28 Apr., 13:27, "Dieter Strassner" <n...@microsoft.com> wrote:
..


> Warum benutzt Du nicht die eingebaute Teamviewer-Funlktionalität (Unter
> "Extras")?

Du meinst, manuell über die Fernwartung.
Nun, die Benutzer der Fernwartung sind hauptsächlich Service-Leute.
Die sollen nicht erst lange mit TeamViewer-Einstellungen rumfummeln
müssen. Außerdem soll sich das Monitor-Lock automatisch wieder lösen
(wenn z.B. der Service-Techniker das über die FW vergessen hat).

D.h. es muss über die Visualisierung passieren, die sich vor Ort auf
dem Touchpanel-PC befindet.

Es sei denn, man kann den Teamviewer programmatisch von der Visu
steuern, aber das ist sicher ein weites Feld...Gibt's dazu was?

Gruss

Johannes

Johannes Eble

unread,
Apr 29, 2010, 12:35:19 PM4/29/10
to
Hallo Frank,

vielen Dank für deine wertvollen Tipps soweit.

Der Hauptteil der Lösung (Dank auch an die anderen) zielt darauf ab,
die MONITOR_OFF-Message periodisch zu senden. Der Techniker von der
Firma, von der wir den Touchpanel PC haben, meint, dass dann der
Monitor immer wieder in den Standby gehen und wieder angehen würde,
was sich vermutlich nachteilig auf die Lebensdauer auswirken könnte.

S.u.:

On 28 Apr., 06:44, "Frank Dzaebel" <P...@FranksSeite.de> wrote:
> Hallo Johannes,
...


> ansich kann man einen MouseHook benutzen.

Kannst du das genauer ausführen (idealerweise mit Code-Snippets). Ich
habe noch nie mit Hooks gearbeitet. Wenn ich das richtig verstehe, ist
der Unterschied zu "normalem" Windows Code, dass er systemweit
funktionieren würde, also nicht auf ein Window beschränkt wäre.
Aber das wäre für mich nicht so wichtig, weil sowieso nur die Visu
läuft und diese die volle Bildschrimgröße hat. D.h. ich bin immer in
der Gewalt des (einen) aktiven Fensters.


> Ausserdem würde SetPowerState über WMI
> Win32_DesktopMonitor funktionieren, nur
> unterstützt nicht jeder Monitor die
> PowerManagementCapabilities.

In http://msdn.microsoft.com/en-us/library/aa393485(VS.85).aspx heißt
es

"This method is currently not implemented by WMI. To use this method,
you must implement it in your own provider."

Heißt das jetzt "geht nicht", oder heißt das nur, dass es vom Treiber
abhängt, ob es implementiert ist?

Gruss

Johannes

Frank Dzaebel

unread,
Apr 30, 2010, 12:45:29 AM4/30/10
to
Hallo Johannes,

> Der Hauptteil der L�sung (Dank auch an die anderen) zielt darauf ab,


> die MONITOR_OFF-Message periodisch zu senden.

eben nicht. Das war bei Jochen Kalmbachs L�sung so.
Bei meiner nicht. Die reagiert nur, wenn sich der Cursor
an eine neue Stelle bewegt hat.

Johannes Eble

unread,
Apr 30, 2010, 2:17:42 AM4/30/10
to
Hallo Frank,

das stimmt, deine Lösung ist in der Hinsicht schon wesentlich besser.
Andererseits kannst du davon ausgehen, dass, wenn jemand über die
Fernwartung reingeht, die Maus auch häufig bewegt wird.

Gruss

Johannes

On 30 Apr., 06:45, "Frank Dzaebel" <P...@FranksSeite.de> wrote:
> Hallo Johannes,
>

> > Der Hauptteil der Lösung (Dank auch an die anderen) zielt darauf ab,


> > die MONITOR_OFF-Message periodisch zu senden.
>

> eben nicht. Das war bei Jochen Kalmbachs Lösung so.

0 new messages