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