![]() |
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 |
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; |
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? |
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: |
AW: Sendmessage und onChange, onKeypress
Könnte es sein, dass es sich gar nicht um einen Text handelt sondern um einen Hinweis, der mit
![]() 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 |
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: |
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