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
> Wie kann ich das unterbinden?
while(true)
{
SendMessage...
Thread.Sleep(10)
}
--
Greetings
Jochen
My blog about Win32 and .NET
http://blog.kalmbachnet.de/
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/>
> 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
[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;
[..]
> 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
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
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
> 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.
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.