Entwickler-Ecke

Windows API - Fenster aktivieren aus DLL (Hook)


mischer - Di 08.06.04 12:09
Titel: Fenster aktivieren aus DLL (Hook)
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:

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 - 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 - Di 08.06.04 12:27

Danke für die schnelle Antwort,

also der Hook macht jeweils folgendes:

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 - Di 08.06.04 12:41

Du verwendest also den Code:

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 - Mi 09.06.04 14:30

Hi,

erstmal Danke für die Antwort!

Ich verwende jetzt die Methode

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 - Mi 16.06.04 18:49

bist du denn sicher, dass der hook auch alle Tastaturanschläge "mitbekommt"?



MrSaint


raziel - Mi 16.06.04 20:31

Hallo!

Spontan würden mir zwei Dinge einfallen:


raziel