Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Sendmessage an Eingabefeld (https://www.delphipraxis.net/212066-sendmessage-eingabefeld.html)

Thomas2017 12. Dez 2022 09:52

Sendmessage an Eingabefeld
 
Hallo,
ich möchte an ein anderes Nichtdelphiprogramm, welches aus einem Eingabefeld und 2 Buttoms besteht,
einen Text in das Einabefeld senden und anschließend einen der beiden Button automatisiert
betätigen.
Mein nachfolgender Ansatz bewirkt lediglich, das ich den Titel des Fensters der anderen Anwendung
"umschreibe".

Delphi-Quellcode:
 
TheWindowHandle := FindAWindow('fremdesprogramm.exe:', '');
 windows.SendMessage(TheWindowHandle, WM_Settext,0,Integer(PCHAR('test')));
Kann mir jemand auf die Sprünge helfen, wie ich das Eingabefeld erreiche.
Wäre auch über den Hinweis auf eine diesbezügliche verständliche Doku
sehr dankbar.

DeddyH 12. Dez 2022 10:00

AW: Sendmessage an Eingabefeld
 
Such doch einmal nach WinSpy, das Tool kann Dir sogar Code generieren, mit dem Du das Handle des Eingabefelds ermitteln kannst (sofern es sich um Standard-Controls mit Windows-Handle handelt, bei Java-Programmen etc. wird es wohl nicht funktionieren).

himitsu 12. Dez 2022 10:36

AW: Sendmessage an Eingabefeld
 
Genau, dein Code macht das, was du da tust.
Fenster suchen und bei ihm den Text (Titel) ändern.


Mit FindWindowEx in dem Fenster weitersuchen, nach Edit und Button.

Falls es ein "Dialog" ist, dann kann man auch mit dem Fensterhandle (Dialoghandle) und der Komponenten-ID via SetDlgItemText (statt SetWindowText).

Thomas2017 12. Dez 2022 13:16

AW: Sendmessage an Eingabefeld
 
Ich habe mir Winspy besorgt und darin das Edit-Fenster ausgewählt sowie mittels des integrierten Code-Generatos den Quelltext erzeugt.
Wenn ich diesen ausführe, blinkt das Edit kurz auf, es wird jedoch nichts an das Edit gesandt. Es wird jedoch das Eingabefenster aktiviert,
wenn ich
Delphi-Quellcode:
SetForeGroundWindow(wndMain);
setze .
Hier der von Winspy generierte Programmcode:

Delphi-Quellcode:
var
  wndMain, wndChild: HWND;
begin
  wndMain := FindWindow('#32770','Eingabe');
  if wndMain <> 0 then
  begin
    wndChild := FindWindowEx(wndMain, 0, 'Edit', nil);
    if wndChild <> 0 then
    begin
      ShowMessage('Window Handle: ' + IntToStr(wndChild));
      FlashControl(wndChild); // internal function
    end;
  end;
  SetForeGroundWindow(wndMain);
end.
Mir fehlt im Grunde der Befehl, um Text an das "wndChild" zu senden.
Der Befehl
Delphi-Quellcode:
SetWinText(wndChild, 'test');
macht nichts...

himitsu 12. Dez 2022 13:26

AW: Sendmessage an Eingabefeld
 
Was ist FindAWindow und SetWinText, bzw. wo kommt das her?

MSDN-Library durchsuchenSetWindowText oder MSDN-Library durchsuchenWM_SETTEXT (am Besten mit Delphi-Referenz durchsuchenSendTextMessage anstatt MSDN-Library durchsuchenSendMessage)

Zitat:

Delphi-Quellcode:
Integer(PCHAR('test'))

Und solltest du irgendwann mal auf 64 Bit umstellen wollen, wird dir so ein Mist wie Integer-Casts das Genick brechen.

Hier, beim SendMessage/PostMessage, nimmt man für sowas die richtigen Typen, wie
Delphi-Quellcode:
LPARAM(PChar('test'))
(ja genau, jenen Typen, mit welchem dieser Parameter im SendMessage deklariert wurde)
oder notfalls z.B.
Delphi-Quellcode:
IntPtr(PChar('test'))

Delphi-Quellcode:
NativeInt(PChar('test'))

Thomas2017 14. Dez 2022 09:13

AW: Sendmessage an Eingabefeld
 
Hallo,
das
Zitat:

Was ist FindAWindow und SetWinText, bzw. wo kommt das her?
war noch aus den vorherigen Versuchen. Sorry für die Vermischung.

Vielen Dank für eure fachkundige Unterstützung.
Es läuft... :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:11 Uhr.

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