AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Sendmessage und onChange, onKeypress
Thema durchsuchen
Ansicht
Themen-Optionen

Sendmessage und onChange, onKeypress

Ein Thema von whiteF · begonnen am 31. Okt 2016 · letzter Beitrag vom 2. Nov 2016
Antwort Antwort
whiteF

Registriert seit: 14. Okt 2008
45 Beiträge
 
#1

Sendmessage und onChange, onKeypress

  Alt 31. Okt 2016, 08:11
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
  Mit Zitat antworten Zitat
t.roller
(Gast)

n/a Beiträge
 
#2

AW: Sendmessage und onChange, onKeypress

  Alt 31. Okt 2016, 14:10
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;
  Mit Zitat antworten Zitat
whiteF

Registriert seit: 14. Okt 2008
45 Beiträge
 
#3

AW: Sendmessage und onChange, onKeypress

  Alt 1. Nov 2016, 18:02
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.163 Beiträge
 
Delphi 12 Athens
 
#4

AW: Sendmessage und onChange, onKeypress

  Alt 1. Nov 2016, 20:36
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 1. Nov 2016 um 21:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#5

AW: Sendmessage und onChange, onKeypress

  Alt 1. Nov 2016, 20:50
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.163 Beiträge
 
Delphi 12 Athens
 
#6

AW: Sendmessage und onChange, onKeypress

  Alt 2. Nov 2016, 10:53
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
whiteF

Registriert seit: 14. Okt 2008
45 Beiträge
 
#7

AW: Sendmessage und onChange, onKeypress

  Alt 2. Nov 2016, 19:48
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;
  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 03:26 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