Einzelnen Beitrag anzeigen

chrschn
(Gast)

n/a Beiträge
 
#1

DLL-Fenster erhält nicht alle Keyboard-Events?!

  Alt 16. Nov 2004, 23:18
Hi all.

Ich habe folgendes Problem: Ich habe eine Anwendung geschrieben, die sozusagen Plugin-DLLs verwendet. Diese DLLs haben auch einen Konfigurationsform. Da ich aber mit meiner Anwendung nicht die Borland-MM-DLL weitergeben möchte, verwende ich nur einfache Datentypen, Pointer, PChar usw.

Damit das Konfigurationsform im Haupt-Konfigurationsform der EXE angezeigt wird, zeige ich das jeweilige DLL-Fenster in einem TPanel auf meinem Hauptfenster an. Die DLLs exportieren alle in etwa folgende Funktion:

Delphi-Quellcode:
procedure ShowConfigDlg(const ID: Integer; const ParentWindow: THandle;
  const Left: Integer; const Top: Integer; const Width: Integer;
  const Height: Integer);
begin
  if not Assigned(ConfigForm) then
    begin
      ConfigForm := TConfigForm.Create(NIL);
      ConfigForm.ParentWindow := ParentWindow;
    end;
    
  ConfigForm.Left := Left;
  ConfigForm.Top := Top;
  ConfigForm.Width := Width;
  ConfigForm.Height := Height;
  ConfigForm.Visible := true;
end;
Die DLLs werden dann in einem TTreeView im Hauptfenster hierarchisch dargestellt. Im Hauptfenster rufe ich die Funktionen dann wie folgt auf:

Delphi-Quellcode:
type
  TShowConfigDlgProc = procedure(const ID: Integer; const ParentWindow: THandle;
                         const Left: Integer; const Top: Integer;
                         const Width: Integer; const Height: Integer);
var
  ShowCfgDlg: TShowConfigDlgProc;
  Handle: THandle;
begin
  Handle := LoadLibrary(PChar(FileName));
  @ShowCfgDlg := GetProcAddress(fHandle, 'ShowConfigDlg');
  ShowConfigDlg(ConfigPanel.Handle, 0, 0, ConfigPanel.ClientWidth, ConfigPanel.ClientHeight)
end;
Das klappt auch alles ganz gut. Allerdings erhalten die Komponenten wie TEdit in dem DLL-Fenster nicht alle Tastatur-Ereignisse. Genauer: Ich habe den Eindruck, sie erhalten die Ereignisse, aber so, als ob die ALT-Taste dabei gedrückt würde. Ich kann in die Edit-Felder Zahlen und die meisten Buchstaben eingeben (nicht alle!), allerdings kann ich mich nicht mit den Pfeiltasten links oder rechts im Text bewegen.

Wenn ich 'a' tippe, passiert gar nix, wenn ich 'c' tippe, wird das Haupt-Konfigurationsfenster der EXE geschlossen, als ob ich ALT+C gedrückt hätte. Wenn ich für die besagten Edit-Felder im DLL-Fenster eine OnKeyDown oder OnKeyPress-Routine schreibe, dann wird tatsächlich nur für die Tasten ein Event ausgelöst, die ich tippen kann, also z. B. nicht für 'a'.

Ich habe es dann mal mit einem TApplicationEvents versucht, den ich auf dem Haupt-Konfigurationsfenster platziert habe. Für diesen habe ich dann folgenden OnMessage-Handler geschrieben:

Delphi-Quellcode:
procedure TConfigForm.ApplicationKeyboardEventsMessage(var Msg: tagMSG;
  var Handled: Boolean);
const
  SYS_KEYS: set of Byte = [VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT, VK_TAB, VK_RETURN];
var
  Handle: THandle;
begin
  if (Msg.message = WM_KEYDOWN) or (Msg.message = WM_KEYUP) then
    if (Msg.wParam in SYS_KEYS) then
      begin
        Handle := GetFocus;
        SendMessage(Handle, Msg.message, Msg.wParam, Msg.lParam);
        Handled := True;
      end;
end;
Damit kann ich jetzt immerhin die Pfeiltasten in den DLL-Edits verwenden. Die "normalen" Buchstaben bekomme ich trotzdem nicht alle. Wenn ich die Zeile "if (Msg.wParam in SYS_KEYS)" auskommentiere, habe ich überhaupt keine Buchstaben mehr im DLL-Fenster, nur noch Pfeiltasten.

Ich glaube, ich könnte das ganze wohl über globale Tastatur-Hooks lösen, ich habe auch Assabard's Tutorial gelesen. Aber ich glaube, dass das für meinen Zweck absoluter Overkill ist, denn
1. muss dann jede DLL (und es sind ein paar) diese Hooks setzen,
2. muss jede die Ereignisse dann auch noch verarbeiten und
3. muss das doch auch irgendwie einfacher gehen

Hat jemand einen schlauen Rat?

Danke im Voraus!

Christian
  Mit Zitat antworten Zitat