| 

.NET C# Java Javascript Exception

2
Eine vorgegebene Softwareanwendung möchte ich durch mein Programm fernsteuern. Das geht leider nur mit Sendkeys, was von meinem „Sendeprogramm“ ausgeht. Das funktioniert auch, solange beide Programme vom angemeldeten Benutzeraccount gestartet wurden und dieser den sichtbaren Desktop zur Verfügung hat. Ich meine damit auch, dass die Programme auf den Bildschirm Zugriff haben.

Ich wollte noch etwas anderes auf dem Rechner machen und den automatischen Ablauf nicht versehentlich durch meine Tastatureingaben stören, bzw. auch vermeiden, dass versehentlich Eingaben vom „Sendeprogramm“ an die Anwendung gelangen, die ich benutzen will.

Bei Windows Vista kann man ja den Benutzer wechseln. Also starte ich zunächst als „Benutzer A“ mein „Sendeprogramm“. Zu diesem Zeitpunkt ist „Benutzer A“ auch „Desktopbenutzer“. Das Sendeprogramm startet seinerseits das zu steuernde Programm und erhält die PID, was funktioniert. Ich lasse die Programme weiter laufen und melde mich dann als „Benutzer A“ ab und als „Benutzer B“ neu an, um etwas anderes zu machen. Leider musste ich feststellen, dass dann die Fernsteuerung nicht mehr funktioniert. Zwar kann mein „Sendeprogramm“ die zu steuernde Anwendung starten - dazu wird kein Sendkeys benutzt – aber es gelangen keine Tastaturkommandos vom Sendeprogramm an die gestartete Anwendung. Das könnte daran liegen, dass „Benutzer A“ nicht mehr „Desktopbenutzer“ ist. Vermutlich kann nur der „Desktopbenutzer“ Sendkeys benutzen. Dies ist in der beschriebenen Konstellation nicht zu gebrauchen.

Ist meine Überlegung richtig und kennt jemand eine Lösung?
News:
20.02.2011
Softpfleger 31 3
6 Antworten
1
Vielleicht ist es besser, ein Beispiel zu bringen: Als Modell für die zu steuernde Anwendung soll Notepad dienen. Mein vereinfachtes "Sendeprogramm" ist eine Forms-Anwendung, die Notepad.exe startet und über Timer alle 10 Sekunden die Uhrzeit in eine Zeile schreibt. Das kann man sich eine halbe Minute oder so ansehen, dann einen Benutzerwechsel durchführen, nach einiger Zeit > 10 Sekunden wieder Benutzerwechsel auf den ersten Benutzer. Man wird dann feststellen, dass wieder in Notepad geschrieben wird, aber keine Einträge von der Zeit vorhanden sind, als der andere Benutzer die Desktopkontrolle hatte. Währenddessen hat Senkeys nicht gearbeitet. - Ich aber möchte, dass die Einträge lückenlos sind! Wenn's geht!

Programmbeispiel ------------>
Public Class Form1
Dim Pid As Integer = 0
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Pid = Shell("notepad.exe", AppWinStyle.NormalFocus, True, 9000)
Timer1.Interval = 10000
Timer1.Enabled = True
End Sub
Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
AppActivate(Pid)
SendKeys.SendWait(Now.ToLongTimeString + vbCr)
End Sub
End Class
20.02.2011
Softpfleger 31 3
0
Das liegt tatsächlich daran, dass unterschiedliche Sessions zum Einsatz kommen (ein User hat mehrere Sessions, hat mehrere Desktops, hat mehrere Fenster). Du kannst dein Senskeys Programm einfach in der anderen Session starten oder Du baust einen kleinen server, welcher per Named Pipe Sendkeys-Befehle entgegen nimmt. Der Server läuft in der gleichen Session wie das zu steuernde Programm, und dein eigentliches Sendkeys-Programm kann nun überall laufen.
20.02.2011
alexander 840 2 9
0
Sofern Du unter .NET programmierst, schau mal im .NET Framework Developer Center unter Windows Communication Foundation (WCF). WCF ermöglicht Kommunikation zwischen Anwendungen, Prozessen und Computern.

"Windows Communication Foundation is...a part of the .NET Framework that provides a unified programming model for rapidly building service-oriented applications that communicate across the web and the enterprise"


Wenn es lediglich darum geht ein anderes Programm "fernzusteuern", ist der Ansatz von alexander aber wohl ausreichend.
20.02.2011
Joachim 3,1k 4 9
Joachim 3,1k 4 9
0
Anmerkung:
Bei der Verwendung von SendKeys hast Du leider das Problem, dass Du nicht wirklich auf Fehlerzustände reagieren kannst. Du simulierst ja nur Tastenkombinationen und sendest diese zur Zielanwendung. Dagegen ist ja nichts einzuwenden, wenn Du sicher bist, dass die Zielanwendung nicht irgendwann mal eine Fehlermeldung anzeigt.

Lösungsvorschlag:
Mein jetzt mal ganz pragmatischer Lösungsvorschlag wäre, alles in einer Virtuellen Maschine laufen zu lassen und diese einfach zu minimieren.

Das hat jetzt zwar nichts mit besonders schlauer Programmierung zu tun, dürfte aber ziemlich effektiv zum gewünschten Ergebnis führen.
20.02.2011
Torsten Weber 691 1 8
0
neue Hypothese:
Vielleicht funktioniert AppActivate nicht mehr, wenn der Benutzer, der das "Sendeprogramm" gestartet hat, sich vom Desktop abmeldet (wenngleich das Programm weiter läuft)? - Es fehlt dann das "Ziel" für SendKeys(?).
20.02.2011
Softpfleger 31 3
0
Zwischenstand:
Es scheint doch an AppActivate zu liegen: AppActivate funktioniert nicht mehr, wenn der Benutzer, der das "Sendeprogramm" gestartet hat, sich vom Desktop abmeldet.

Es hilft aber alle Fenster - außer dem Empfänger-Fenster - zu minimieren, bevor man sich abmeldet.
21.02.2011
Softpfleger 31 3

Stelle deine Windows-Frage jetzt!