AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Tastendruck an Fremdsoftware

Ein Thema von Ykcim · begonnen am 14. Apr 2021 · letzter Beitrag vom 15. Apr 2021
Antwort Antwort
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
804 Beiträge
 
Delphi 10.4 Sydney
 
#1

Tastendruck an Fremdsoftware

  Alt 14. Apr 2021, 16:33
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
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Tastendruck an Fremdsoftware

  Alt 14. Apr 2021, 17:02
sendinputhelper funktioniert tadellos.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Tastendruck an Fremdsoftware

  Alt 14. Apr 2021, 19:27
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.
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
804 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Tastendruck an Fremdsoftware

  Alt 14. Apr 2021, 23:02
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
Patrick

Geändert von Ykcim (14. Apr 2021 um 23:04 Uhr)
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
629 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Tastendruck an Fremdsoftware

  Alt 15. Apr 2021, 17:40
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.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Tastendruck an Fremdsoftware

  Alt 15. Apr 2021, 18:36
Ich bin eher ein fan von GetDlgItem(), aber wie Du es machst geht es auch.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:27 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