Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Tastendruck an Fremdsoftware (https://www.delphipraxis.net/207612-tastendruck-fremdsoftware.html)

Ykcim 14. Apr 2021 16:33

Tastendruck an Fremdsoftware
 
Hallo Zusammen,

es gibt zwar schon viel zu dem Thema, aber leider habe ich die Lösung damit nicht zusammenbekommen.

Ich übergebe verschiedene Daten an eine Fremdsoftware und drücke dort auch Buttons. Das klappt mittlerweile auch. Jetzt muss ich in dem Menü einen Eintrag auswählen. Das ist ein Menü, dass wie ein MainMenü aussieht. Ich kann zwar das Handle von der Anwendung und das Handle des gesamten Menüs ermitteln, aber nicht die einzelnen Menüpunkte.

Jetzt war mein Gedanke, dass die der Software einfach ein paar Tastendrücke übermittle. Die Taste F10 aktiviert das Menü, genau wie die ALT-Taste.

Delphi-Quellcode:
procedure TFrm_BD_Orga.Select_Module(hApp: HWND; Module: integer);
var  I: Integer;
      wnd: HWND;
      CName: array [0 .. 255] of Char;
begin
   if hApp = 0 then begin
      hApp := FindWindow(nil, 'Fremdsoftware');  //Handle der Software
      GetClassName(hApp, CName, 256);
      wnd := FindWindowEx(hApp, 0, CName, 'MenuStrip1');  // Handle des Menüs
   end;

   PostMessage(wnd, WM_KEYDOWN, VK_F10, 0);
   PostMessage(wnd, WM_KEYUP, VK_F10, 0);

   PostMessage(wnd, WM_KEYDOWN, VK_RIGHT, 0);
   PostMessage(wnd, WM_KEYUP, VK_RIGHT, 0);

   for I := 0 to Module -1 do begin
      PostMessage(wnd, WM_KEYDOWN, VK_Down, 0);
      PostMessage(wnd, WM_KEYUP, VK_Down, 0);
  end;
  PostMessage(wnd, WM_KEYDOWN, VK_RETURN, 0);
  PostMessage(wnd, WM_KEYUP, VK_RETURN, 0);
end;
Ich habe versucht, sowohl dem Menür selber, als auch der ganzen App eine Taste zu übermitteln. Leider reagiert sie nicht.

Hat jemand eine Idee?

Vielen Dank
Patrick

KodeZwerg 14. Apr 2021 17:02

AW: Tastendruck an Fremdsoftware
 
sendinputhelper funktioniert tadellos.

Der schöne Günther 14. Apr 2021 19:27

AW: Tastendruck an Fremdsoftware
 
Ich will keinen auf Schlauscheißer machen, aber wenn du den ersten Satz der Doku zu PostMessage liest kommst du vielleicht schon auf den Grund.

Ykcim 14. Apr 2021 23:02

AW: Tastendruck an Fremdsoftware
 
Hallo Zusammen,

Ich habe gerade noch ein bißchen getestet und probiert und dabei eine Lösung gefunden, die ich morgen in schöner bauen werde:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var  I: Integer;
      wnd, hApp: HWND;
      CName: array [0 .. 255] of Char;
begin
   hApp := FindWindow(nil, 'FremdSoftware'); //Handle der Software
   GetClassName(hApp, CName, 256);
   wnd := FindWindowEx(hApp, 0, CName, 'Menue'); // Handle des Menüs

   //Wählt den ersten Hauptmenüpunkt
   PostMessage(wnd, WM_KEYDOWN, VK_Right, 0);
   PostMessage(wnd, WM_KEYUP, VK_Right, 0);
   //Wählt den zweiten Hauptmenüpunkt
   PostMessage(wnd, WM_KEYDOWN, VK_Right, 0);
   PostMessage(wnd, WM_KEYUP, VK_Right, 0);
   //Öffnet mit ENTER das PullDownMenü des zweiten Hauptmenüpunkt
   PostMessage(wnd, WM_KEYDOWN, VK_RETURN, 0);
   PostMessage(wnd, WM_KEYUP, VK_RETURN, 0);
   //Markiert den ersten Eintrag des PullDownMenüs
   PostMessage(wnd, WM_KEYDOWN, VK_Down, 0);
   PostMessage(wnd, WM_KEYUP, VK_Down, 0);
   //Markiert den zweiten Eintrag des PullDownMenüs
   PostMessage(wnd, WM_KEYDOWN, VK_Down, 0);
   PostMessage(wnd, WM_KEYUP, VK_Down, 0);
   //Markiert den dritten Eintrag des PullDownMenüs
   PostMessage(wnd, WM_KEYDOWN, VK_Down, 0);
   PostMessage(wnd, WM_KEYUP, VK_Down, 0);
   //Markiert den vierten Eintrag des PullDownMenüs
   PostMessage(wnd, WM_KEYDOWN, VK_Down, 0);
   PostMessage(wnd, WM_KEYUP, VK_Down, 0);
   //Führt den vierten (markierten) Menüpunkt aus
   PostMessage(wnd, WM_KEYDOWN, VK_RETURN, 0);
   PostMessage(wnd, WM_KEYUP, VK_RETURN, 0);
end;
Damit scheint es zu funktionieren... Offensichtlich brauche ich das Menü garnicht mit ALT oder F10 zu aktivieren. Mit dem entsprechenden Handel kann ich darin direkt navigieren...

Gute Nacht
Patrick

Rolf Frei 15. Apr 2021 17:40

AW: Tastendruck an Fremdsoftware
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1487147)
Ich will keinen auf Schlauscheißer machen, aber wenn du den ersten Satz der Doku zu PostMessage liest kommst du vielleicht schon auf den Grund.

Du solltest den ersten Satz vieleicht selber nochmals genauer Lesen. :) Da steht nichts davon, dass das was er machen will nicht geht. Die Message wird an den Message Queue des Threads geschickt, der das übergebene Window Handle erstellt hat. Das ist also alles so richtig und genau das was er will.

KodeZwerg 15. Apr 2021 18:36

AW: Tastendruck an Fremdsoftware
 
Ich bin eher ein fan von GetDlgItem(), aber wie Du es machst geht es auch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz