Zum Inhalt springen

C# Anwendung über SendMessages fernsteuern


Didii

Empfohlene Beiträge

Hallo zusammen,

habe folgendes Problem. Soll mittels einer c#-Sharp-Anwendung eine externe Anwendung über SendKeys bzw. WinApi-Funktionen fernsteuern.

ich schaffe es die Anwendung in den Vordergrund zu bringen und zu aktivieren doch, habe ich es bis jetzt nicht geschafft, das Menü (Date, Einstellungen,...) usw. aufzuklappen und einen Punkt auszuwählen.

Für das habe ich auch folgenden Beispielcode aus VB:


Dim mFilehwnd As Long

    If (lVodafone.mHwnd = 0) Then

        Run

        lVodafone.mHwnd = FindWindow("D2Activate-MainClass", lVodafone.VodafoneTitle)

    End If

    lVodafone.Menuhwnd = GetMenu(lVodafone.mHwnd)

    DoEvents

    mFilehwnd = GetSubMenu(lVodafone.Menuhwnd, 0)

    PostMessage lVodafone.mHwnd, WM_COMMAND, GetMenuItemID(mFilehwnd, &O6), mFilehwnd

    DoEvents

ich habe diesen Code wie folgt in C# übersetzt, es funktioniert aber nicht:

int mMenu = ActivePlusController.GetMenu(lHwnd);

int mMenuFile = ActivePlusController.GetSubMenu(mMenu, 0);

Application.DoEvents();

int mMenuFileID = ActivePlusController.GetMenuItemID(mMenuFile, 7);

Application.DoEvents();


ActivePlusController.PostMessage(lHwnd, WM_COMMAND, mMenuFileID, mMenuFile);

Application.DoEvents();

ich hoffe irgendjemand hier drinnen kann mir helfen!!! :(

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vorab: Ich habe so etwas noch nie gemacht und halte es prinzipiell für eine schlechte Idee. Wenn es also keine "offizielle" Schnittstelle zum Fernsteuern gibt, würde ich es sein lassen.

Letztlich läuft es darauf hinaus, das Du dem Programm Nachrichten unterschiebst. Allerdings kann es je nach GUI-Design mehr als einen Nachrichten-Handler geben, so dass das Auffinden des Hauptfensters nicht in jedem Fall reichen mag und Nachrichten per SendMessage den falschen Handler erreichen. Für WM_COMMAD musst Du auch die IDs kennen, die das zu steuernde Programm verwendet. Diese können sich auch von Version zu Version ändern. Ein Menü visuell aufklappen wirst Du hiermit aber nicht, nur die Aktion auslösen.

Ein anderer Weg wäre es, das Fenster zu finden, in den Vordergrund zu bringen (SetForegroundWindow) und mit der API Funktion keyb_event künstlich Tastatureingaben zu erzeugen. Ob die Windows.Forms Methode SendKeys.Send in diesem Fall das gleichte tut, weiss ich leider nicht.

Vielleicht helfen Dir die Ansätze ja etwas weiter.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

1. mal Danke für deine Antwort.

Jedoch möchte ich erwähnen dass es tatsächlich kein Schnittstelle zum steuern des Programms gibt, und ich es nicht einfach lassen kann, weil es ein Teil eines Projekts meiner Firma ist und nicht nur eine Spass-Anwendung.

Trotzdem nichts für ungut.

Die ID´s kann man ja auch mit API-Funktionen herausfinden.

aber ich versuche es jetzt mal mit der API-Funktion "keyb_event", das hört sich gut an.

Dazu hätte ich aber noch eine Frage:

Ist das dann das selbe wie SendKeys????

denn das wollte ich vermeiden, denn SendKeys gehen immer an die aktuelle Anwendung und wer garantiert mir dass nicht auf dem Rechner auf einmal ein anderes Programm gestartet wird???

Wäre dankbar für weitere Vorschläge und Hilfen.

Gruß

Didii

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vorab noch mal: Ich rate vom Vorgehen weiter ab, zumindest solltest Du Dir genau überlegen, was alles falsch laufen kann. Was wenn Du z.B. durch eine neue Version der zu steuernden Software versehentlich viele Daten löschst? Wenn es also irgendetwas Kritisches ist und die zu steuernde Software auch bei Euch entwickelt wird, würde ich lieber dort die notwendigen Schnittstellen nachrüsten.

Aber nehmen wir einmal an, Du möchtest trotzdem weitermachen :-)

Möglichkeit 1: Nachrichten versenden

Wenn das zu steuernd Programm ein Windows-Programm ist, kannst Du versuchen Nachrichten über Ereignisse an die Message-Loop des jeweiligen Fensters zu senden. Stichwort: SendMessage. Sind mehrere Fenster im Spiel (Dialoge z.B.), musst Du die Nachrichten an das richtige Ziel schicken. Es kann sein, das diese Vorgehensweise nicht zum gewünschten Ziel führt, da Du nicht weißt, wie die Programme ihre Nachrichten verarbeiten (z.B. ob es für sie einen Unterschied macht, ob sie gerade den Fokus haben).

Möglichkeit 2: Eingaben simulieren

keybd_event oder (besser) SendInput fügen Tastatur und/oder Mauseingaben in die Eingabewarteschlange ein. Im Ergebnis sollte das also so sein, als ob ein Benutzer die Eingaben sehr schnell hintereinander selbst gemacht hat. Wenn Du das zum Steuern nutzt, musst Du unbedingt sicherstellen, das das richtige "Zielfenster" auch im Vordergrund und aktiv ist (SetForegroundWindow), sonst werden z.B. Tastatureingaben fehlgeleitet. Dazu rufst Du am besten kurz vorher die entsprechende Funktion auf, um das sicherzustellen. Und wenn der Vorgang etwas länger dauert, hoffen, das kein User an der Konsole dazwischenfunkt.

Wenn Du selbst keine Win32 API Funktionen verwenden möchtest und bei .NET bleiben willst: SendKeys sollte laut Dokumentation in etwa das gleiche wie SendInput machen, aber nur für Tastatureingaben. Um die zu steuernde Anwendung in den Vordergrund zu bringen, könntest Du aus VB.NET die Funkrion AppActivate verwenden. Man müsste sie, wenn man den Namespace referenziert, aber auch von C# aus verwenden können. Es gibt dazu auch ein Beispiel im Zusammenhang mit Notepad.

Ich hoffe, dass ich Dir geholfen habe.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo

nochmal danke für deine Hilfestellung.

Ich habe es jetzt wie folgt geschafft tastenbefehle an die app zu senden:


uint WM_KEYDOWN = 0x100;

uint WM_KEYUP = 0x101;

int vk_F9 = 0x78;

int vk_ESCAPE = 0x1B;		

AtivePlusController.PostMessage(lHwnd, WM_KEYDOWN, vk_ESCAPE, 0);

ActivePlusController.PostMessage(lHwnd, WM_KEYUP, vk_ESCAPE, 0);

ActivePlusController.PostMessage(lHwnd, WM_KEYDOWN, vk_F9, 0);

ctivePlusController.PostMessage(lHwnd, WM_KEYUP, vk_F9, 0);

Das hilft mir schon ein ganzes Stück weiter.

Jetzt müsste ich es nur noch schaffen, Textboxen auszulesen, bzw. zu füllen und button zu drücken.

Ich hab schon die ganze Zeit gegoogelt und gelesen, dass jedes Element (Textbox) als Window zu betrachten ist.

Ausserdem hab ich gesehen dass man Textboxen über FindWindowEx ermitteln kann.

Das funktioniert aber bei mir komischerweise nicht!

ich habe auch keinen Namen der TextBoxen sondern nur eine ID (mit Winspector herausgefunden)

Wäre voll cool wenn mir noch jemand weiterhelfen könnte.

Gruß

didii

Link zu diesem Kommentar
Auf anderen Seiten teilen

Button drücken: Du sendest nur die Nachricht, die das Anwählen eines Buttons ausgelöst hätte. Mit dem Button selbst (und seinem Fenster) brauchst Du dich nicht zu befassen.

Textboxen: Die Standart-Windows-Textboxen sind Fenster der System-Fensterklasse "Edit". Allerdings gibt es haufenweise Programme, die ihre eigene Klasse dafür festlegen oder die Textboxen gleich komplett selbst neu implementieren und zeichnen. Ausserdem gibt es ja noch die RichEdit-Textboxen.

Wie versuchst Du auf den Text zuzugreifen? Mit GetDlgItemText?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...