Didii Geschrieben 2. November 2004 Teilen Geschrieben 2. November 2004 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!!! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 2. November 2004 Teilen Geschrieben 2. November 2004 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Didii Geschrieben 3. November 2004 Autor Teilen Geschrieben 3. November 2004 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 3. November 2004 Teilen Geschrieben 3. November 2004 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Didii Geschrieben 4. November 2004 Autor Teilen Geschrieben 4. November 2004 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 4. November 2004 Teilen Geschrieben 4. November 2004 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Didii Geschrieben 4. November 2004 Autor Teilen Geschrieben 4. November 2004 Hallo das drücken eines Button habe ich bereits geschafft. aber die Textboxen machen mir Schwierigkeiten! ich habe es mit SendMessage(..., WM_GETTEXT, ...) bzw. WM_SETTEXT versucht. die Api-Funktionen GetDlgItemText haben auch nicht funktioniert. *verzweifl* Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 4. November 2004 Teilen Geschrieben 4. November 2004 Bist Du sicher, dass Du den richtigen Handle vom Control hast? Kannst Du testweise mit Spy++ den Inhalt des Edit-Controls auslesen? Wie rufst Du SendMessage auf? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Didii Geschrieben 5. November 2004 Autor Teilen Geschrieben 5. November 2004 Hallo, danke für deine Hilfe. Habe es jetzt geschafft alles das zu tun was ich wollte mit der Anwendung. special thanx Didii Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.