Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Sendmessage und onChange, onKeypress (https://www.delphipraxis.net/190718-sendmessage-und-onchange-onkeypress.html)

whiteF 31. Okt 2016 08:11

Sendmessage und onChange, onKeypress
 
Hi,
Ich habe eine procedure die ein sendmessage an ein fremdes programm schickt. Das funktioniert gut.
Zum schluss sende ich noch ein kürzel ALT+O um dieses fremde dislogfenster zu schliessen (dies ist ein ok button welches das Fenster schließen lässt).
Diese fremde anwendung sagt mir nun das kein text eingegeben wurde mittels einer msgbox. Jedoch sehe ich den text im richtigen editfeld innerhalb der fremdanwendung.

Jetzt frage ich mich natürlich wie oder was dahinter stecken könnte.
Es könnte ja sein das irgendwelch ereignisse (onChange, onKeypress, etc.) ausgelöst werden die dann wiederrum das erfolgreiche schliessen der fremdanwendung zulässt.
(Wenn ich den text in der fremdanwendung selbst erfasse, dann kommz natütlich keine meldung bei buttonclick auf ok)

Werden denn solche ereignisse beim sendmessage ausgeführt?

Oder habt ihr eine idee woran das hier scheitert?

VG

t.roller 31. Okt 2016 14:10

AW: Sendmessage und onChange, onKeypress
 
Folgendes Beispiel löst ein OnChange-Ereignis aus:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var text : String;
begin
text:= 'test';
SendMessage(Edit1.Handle, WM_SETTEXT, 0, LPARAM(PCHAR(Text)));
end;

whiteF 1. Nov 2016 18:02

AW: Sendmessage und onChange, onKeypress
 
mh,

Aber in der eigentlichen Fremdanwendung erscheint mit diesem Befehl der Text,
wenn ich nun mit der Maus in dieses Edit-Feld mit dem Text klicke, verschwindet der Text und das Edit-Feld ist leer.

Kennt jemand soetwas?

Phänomen oder gewollte programmierung des Fremdprogramms?

himitsu 1. Nov 2016 20:36

AW: Sendmessage und onChange, onKeypress
 
Wenn ich nicht will, dass irgendwer in die Controls meiner Anwendung automatisiert was einfügt, dann würde ich auch dafür sorgen, dass die sichtbaren Controls sich nicht standardkonform verhalten.
Oder die Entwickler haben ein Framework verwendet, welches diesbezüglich einfach nur schrottig reagiert. :stupid:

Dalai 1. Nov 2016 20:50

AW: Sendmessage und onChange, onKeypress
 
Könnte es sein, dass es sich gar nicht um einen Text handelt sondern um einen Hinweis, der mit MSDN-Library durchsuchenEM_SETCUEBANNER gesetzt wurde? Sowas wie in Passwortfeldern, in denen einfach nur "Password" steht, bis man den Cursor in das Feld bringt? Normalerweise sind solche Hinweise nicht ganz so kontrastreich, damit man sie von eingegebenem Text unterscheiden kann.

Denn irgendwie kann ich mir nicht vorstellen, dass ein Programmierer auf die Idee kommt, ein Eingabefelds zu leeren, wenn man mit der Maus hineinklickt... Das wäre Usability gleich Null.

Grüße
Dalai

himitsu 2. Nov 2016 10:53

AW: Sendmessage und onChange, onKeypress
 
Statt dem CUEBANNER gibt/gab es Komponenten, die beim OnEnter/OnExit den Text ausgetauschen,
bzw. die da zwischen ViewText und EditText switchen ... da wird dann der eigentliche Text intern gespeichert und wenn jetzt jemand nur den "externen" (sichtbaren) Text ändert, dann ist der halt weg, wenn die Komponente den Fokus bekommt. :stupid:

whiteF 2. Nov 2016 19:48

AW: Sendmessage und onChange, onKeypress
 
hi,
freut mich dass ihr euch da mit reindenkt...

Der text der mittels SendMessage an das Edit-Feld gesendet wird ist optisch kontrastreich.
Das mit dem verschwindenen Text verhält sich so:
- Wenn ich mittels SendMessage etwas in das Edit-Feld sende, und dann mit der Maus real in das Edit-Feld klicke verschwindet der Text.
- Wenn ich etwas real in das Edit-Feld eintippe, den Fokus real ändere und mit der Maus real wieder in das Edit-Feld klicke bleibt der Text bestehen.

(Bei dem Fenster handelt es sich lediglich um 1x Edit Feld, 1x Button und ein paar RichEdits (text) und diehnt lediglich als hinweisfenster...)


Ich habe nun eine Lösung, die für mich funktioniert, aber eleganter wäre es natürlich mit SendMessage.
Das Lösungswort lautet hier SendString.
Mit SetForegroundWindow(wndMain); hole ich mir das komplette Fenster in den Vordergrund (nachdem ich geprüft habe ob es existiert).
Dann suche ich nach dem Edit-Feld wndChild := FindWindowEx(wndChild, 0, 'Edit', nil); und nach dessen Existenzprüfung sende ich mittels FormMain.SendString('Dies ist der Text'); den Text.
Danach suche ich nach dem OK-Button wndChild := FindWindowEx(wndChild, 0, 'Button', nil); und nach dessen Existenzprüfung klicke ich ihn an SendMessage(wndChild, BM_Click, 0, 0);


Ist zwar nicht 100% sicher, da der Benutzer selbst den Fokus ändern kann und der Text dann in irgendeinem anderen Fenster (bzw. Control) fliegen könnte, aber besser als wenn es gar nicht geht.
Der Text, den ich mit SendString an das Edit-Feld sende, bleibt auch bestehen, wenn ich mit der Maus real in das Edit-Feld klicke.


Delphi-Quellcode:
procedure TFormMain.SendString(AText: String);
var lCount : Integer;
    lScanCode : Smallint;
    lWithAlt,
    lWithCtrl,
    lWithShift : Boolean;
begin
  for lCount := 1 To Length(AText) Do
  begin
    lScanCode := VkKeyScan(AText[lCount]);
    //Ermitteln ob Shift gedrückt wurde
    lWithShift := lScanCode and (1 shl 8) <> 0;
    //Ermitteln ob Strg gedrückt wurde
    lWithCtrl := lScanCode and (1 shl 9) <> 0;
    //Ermitteln ob Alt gedrückt wurde
    lWithAlt := lScanCode and (1 shl 10) <> 0;

    if lWithShift then
      keybd_event(VK_SHIFT, 0, 0, 0);
    if lWithCtrl then
      keybd_event(VK_CONTROL, 0, 0, 0);
    if lWithAlt then
      keybd_event(VK_MENU, 0, 0, 0);

    keybd_event(lScanCode, 0, 0, 0);
    keybd_event(lScanCode, 0, KEYEVENTF_KEYUP, 0);

    if lWithAlt then
      keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
    if lWithCtrl then
      keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
    if lWithShift then
      keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 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