Announcement

Collapse
No announcement yet.

Von welcher Form wurde die Windows Botschaft gesendet ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Von welcher Form wurde die Windows Botschaft gesendet ?

    Hallo,

    gibt es eine Möglichkeit herauszufinden, von welcher Form eine Windows Botschaft gesendet wurde. (z.B. Benutzer drückt Taste)

    Bis denne..

  • #2
    Hi

    Nein. Allerdings glaube ich das Du was ganz anderes meinst. Wenn der Benutzer in einem aktiven Form eine Taste drückt, sendet dieses Form KEINERLEI Messages. Das einzigste was passiert ist das das System wm_KeyDown Messages mit SendMessage() an das mit GetFocus() ermittelte Fenster sendet. Die Default Windowsprocedure des GetFocus() fensters sollte die wm_KeyDown Message nun in wm_Char/wm_SysChar etc. umwandeln und mit PostMessage() in den Messagequeue stellen.

    Nun, ein Delphi TCustomForm bzw. TControl hängt sich da ein bißchen rein, es transliert wm_KeyDown in eine Control Message cm_KeyDown, cm_AppKeyDown etc und sendet sie weiter an sein Top Level Window. Also an den Parent.Parent.Parent .... der KEINEN Parent mehr hat, also das TForm.

    Es stellt sich also für Dich NUR die Frage: <b>"Welches TForm kann überhaupt eine wm_KeyDown Message bekommen ?"</b><br>
    Nur das Form das im Focusierungspath liegt, also das selber oder eines der untergeordnete Controls den Focus besitzt.

    Also:

    <pre>

    var
    C: TWinControl;
    F: TCustomForm;
    begin
    C := FindControl(GetFocus);
    if C <> nil then F := GetParentForm(C)
    else F := nil;
    end;

    </pre>

    Allerdings KANN diese Funktion fehlschlagen. Z.B. eine TComboBox mit Style = csDropDown hat den Focus, das Eingabefenster ist focusiert.
    Dieses Eingabefenster IST KEIN TWinControl und kann somit NICHT mit FindControl() gefunden werden. Deshalb:

    <pre>

    var
    C: TWinControl;
    F: TCustomForm;
    begin
    if Application.Active then
    begin
    C := Screen.ActiveControl;
    F := Screen.ActiveCustomForm;
    end else
    begin
    C := nil;
    F := nil;
    end;
    end;

    </pre>

    Gruß Hage

    Comment

    Working...
    X