Autor Beitrag
mischer
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Di 08.06.04 12:09 
Hi,

ich habe einen Tastaturhook programmiert, der nun bestimmte Tastatureingaben an ein Delphi-Programm weiterleiten soll. Das funktioniert soweit wunderbar, allerdings empfängt das Fenster die Nachrichten nur dann, wenn es auch aktiviert ist.
Ich hab versucht das Fenster mit Hilfe von Befehlen wie:
ausblenden Quelltext
1:
2:
3:
 SetForeGroundWindow(...);
 SetFocus(...);
 ShowWindow(...);

usw. von der DLL aus zu aktivieren bevor ich die SendMessage(...) schicke. Leider sind ihm all diese Befehle offenbar vollkommen Suppe :roll: , kann mir jemand erklären woran das liegt, oder noch besser wie ich das Fenster trotzdem aktivieren kann? :?:

Danke!

MfG mischer
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 08.06.04 12:17 
Mit Nachrichten meinst du sicherlich Windows-Botschaften, und die werden aber immer empfangen, egal, ob das Fenster den Fokus hat oder nicht. (Klar ist, dass eine Tastatureingabe nur an das Fenster weitegeleitet wird, das den Fokus hat.) Wenn Du aber selbst ne Botschaft an ein Fenster schickst, muss es nicht den Fokus haben.

Du solltest vielleicht mal zeigen, wie du diese Botschaften sendest (ok steht angedeutet da) und empfängst, ich nehme an, das ist dein Problem.

Ansonsten: Das mit dem Fokus hat mich auch manches Haar gekostet (das ich mir ausgerissen habe beim Haareraufen). Du könntest mal versuchen den Applikation den Fokus zu geben und dann dem Fenster oder so, das hat bei mir geklappt...

MfG,
Sebastian
mischer Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Di 08.06.04 12:27 
Danke für die schnelle Antwort,

also der Hook macht jeweils folgendes:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
  Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
  case nCode < 0 of
    TRUE: exit; //wenn code kleiner 0 wird nix gemacht
                //if code smaller 0 nothing has to be done
    FALSE:
      begin
        // Taste F1 gedrückt
        if (wparam = 112and (lparam < 0then begin
          // nix
        end;
        // Taste F2 gedrückt
        if (wparam = 113and (lparam < 0then begin
          showwindow(HilfeHandle,sw_shownormal);
          sendmessage(HilfeHandle, ncode, wparam, lparam);
        end;
        // Taste F3 gedrückt
        if (wparam = 114and (lparam < 0then begin
          showwindow(HilfeHandle,sw_shownormal);
          sendmessage(HilfeHandle, ncode, wparam, lparam);
        end;
        // Taste F4 gedrückt
        if (wparam = 115and (lparam < 0then begin
          showwindow(HilfeHandle,sw_shownormal);
          sendmessage(HilfeHandle, ncode, wparam, lparam);
        end;


Und im Programm fange ich dann einfach das Ereignis KeyDown ab. Wie gesagt das funktioniert auch alles wunderbar (solange das Programm den Fokus hat :( )

Wenn ich das ShowWindow(...) weglasse hat es exakt den gleichen Effekt :roll:

MfG mischer

Moderiert von user profile iconMotzi: Code- durch Delphi-Tags ersetzt.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 08.06.04 12:41 
Du verwendest also den Code:
ausblenden Delphi-Quelltext
1:
procedure WM_XY(var message: TMessage); message WM_XY;					

um die Botschaften abzufangen?

Wie wärs, wenn du die WindowProc überschreibst und darüber die Botschaften abfängst? Die bekommt die Botschaften auf jeden Fall immer (Auch, wenn du die Botschaften per BroadcastSystemMessage, bzw SendMessage(HWND_BROADCAST,...) sendest.)
mischer Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 09.06.04 14:30 
Hi,

erstmal Danke für die Antwort!

Ich verwende jetzt die Methode
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TDorSylv.WndProc(var Message : TMessage);
begin
  if ((Message.Msg = WM_KeyUP) or (Message.Msg = WM_KeyDown)) then setcursorpos(200,200);
  inherited WndProc(Message);
end{end function}

um die Botschaft abzufangen.
Aber: Auch die funktioniert nur wenn das Fenster aktiv ist. :evil:

Zur Erklärung: das SetCursorPos ist nur ein Test und nicht für voll zu nehmen. 8)

Was mir dabei komisch vorkommt ist, daß die Tastaturkommandos im aktivierten Fenster ankommen. Sollten die nicht eingentlich im Hook verschwinden? :roll:

Ich bin langsam mit meinen Nerven am Ende mit diesem Ding :?: :?: :?:

MfG mischer


Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt.
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Mi 16.06.04 18:49 
bist du denn sicher, dass der hook auch alle Tastaturanschläge "mitbekommt"?



MrSaint

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
raziel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: Mi 16.06.04 20:31 
Hallo!

Spontan würden mir zwei Dinge einfallen:
  • Ist Dein Hook wirklich Global? (das was MrSaint schon angesprochen hat) und
  • Wie ermittelst Du das Fensterhandle, an das die Nachricht geschickt werden soll?


raziel

_________________
JSXGraph