OnClick Event aus anderer Applikation

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    OnClick Event aus anderer Applikation

    Hallo, kann mir jemand weiter helfen? Ich hab mit FindWindow das Handle eines Fensters aus einer anderen Applikation ermittelt. In diesem Fenster gibt es nun mehrere Buttons. Ich möchte darauf reagieren wenn ein Button gedrückt wurde, bzw eine aktion ausführen in meinem Programm. Es sind zwei Buttons, auf die ich reagieren muss. Ich würde also einen Eventhandler für jeden dieser Buttons benötigen. Wie mache ich das?
    @gegy Du willst das andere Programm fernsteuern. Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also willst du die Events aus einem anderen Prozess abbonieren? AFAIK geht das nicht (für alles). Was du machen kannst, ist z.B. über die WinAPI die Tastatur drücke per GetKeyStateAsync abgreifen oder das "Auf ein fenster klicken" über die Windows Message Queue in Erfahrung bringen. Wenn es dann aber um kompliziertere Sachen geht, wird es schwer.

    Hab da mal in der Schule das ganze in C++ unter VS2010 gemacht. War im Prinzip nix anders, als die WMSGQ (Windows MeSsage Queue) anhand von Indikatoren (Events eben) zu "pollen" - also abzufragen. Das ganze dann entsprechend ausgewertet und verarbeitet. Sinn dahinter (nur zur Erklärung), war eine Anwendung, in der man zur Laufzeit Linien, Kreise und Dreiecke auf einem (in/mit C++ und der WinAPI erstellten) Fenster zu zeichnen.

    Werd heute abend noch mal schauen, ob ich den Code noch hab.
    Lg Radinator

    Edit: Habs doch noch gefunden ;D
    Seltsames Verhalten einer selbst geschriebenen Klasse - Automatischer Destruktoraufruf im ersten Post hab ich das Projekt angehängt. Da ist dann in der Datei fenster.cpp die Funktion int Fenster::EreignisWarteschleife(void).
    Ich kann dir allerdings nicht sagen, ob sich das nur für den eigenen Prozess eignet, oder ob das auch Systemweit geht.

    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Radinator“ ()

    @gegy dann soll das andere Programm Dich fernsteuern?
    Dreh einfach Master und Slave um.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich denk eher das Problem ist, WIE genau soll das notifizieren umgesetzt werden?
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    @Radinator Jou, es muss ein Event ausgelöst werden, sonst geht es nur über das Einbinden als Assembly.
    @gegy Was sind das für Programme?
    Mögliche Antworten:
    - Ich habe zu beiden die Quellen.
    - Ich habe von einem die Quelle, das andere ist xxx.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:


    @gegy Was sind das für Programme?
    Mögliche Antworten:
    - Ich habe zu beiden die Quellen.
    - Ich habe von einem die Quelle, das andere ist xxx.


    Korrekt: Ich habe von einem die Quelle, das andere ist ein CAD Programm, von dem ich das Handle des Buttons ermittelt habe.
    So und wie kann ich nun in meinem Programm darauf reagieren, wenn im CAD Programm dieser Button gedrückt wurde?

    Als Anmerkung: Ich konnte es inzwischen anders lösen, aber mich würde trotzdem interessieren wie das so gehen könnte.
    Du müsstest nen WndProc Hook auf deinen Button injecten. Das kann man nicht mit C# alleine machen, d.h. du müsstest eine Native DLL machen, welche die Funktionalität zum Hooken bietet.

    Also eine C-Dll, welche
    msdn.microsoft.com/en-us/libra…op/ms644990(v=vs.85).aspx
    aufruft. Im Callback musst du dann noch die hier aufrufen:
    msdn.microsoft.com/en-us/libra…op/ms644974(v=vs.85).aspx
    Und wie immer nicht vergessen den Hook wieder zu lösen, sobald du ihn nicht mehr brauchst.

    Außerdem kannst du dann in der C-Dll einen Callback festlegen, welcher von deiner Hook-Procedure in C aufgerufen wird.
    Diesen Callback kannst du dann in C# mittels P/Invoke setzen, ebenfalls mittels P/Invoke rufst du dann die Funktion auf, die den Hook installiert/löst.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---