Toon posts:

[Delphi] Applicatie focus setten

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik gebruik een systemwide keyhook om toetsaanslagen af te vangen.
Wanneer ik een toetsaanslag binnenkrijg terwijl mijn applicatie niet de focus heeft, dan wil ik dat mijn applicatie de focus weer terug krijgt.

Ik heb het volgende geprobeerd (zonder succes) in de routine waar de toetsaanslag wordt afgehandeld

form1.setfocus;
setforgroundwindow(form1.handle);
application.bringtofront;

Alleen de laatste (application.bringtofront) zorgt er voor dat mijn applicatie in de taakbalk gaat knipperen.

Het lijkt wel of Windows niet altijd toelaat dat de focus van een applicatie wordt veranderd...
Iemand een idee?

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

SetForegroundWindow(Handle);

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Topicstarter
Delphi schreef op 28 december 2002 @ 13:11:
SetForegroundWindow(Handle);
SetForegroundWindow(handle) zorgt er alleen voor dat m'n applicatie in de taakbalk gaat knipperen..

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Ook als je de handle van je applicatie opgeeft?

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Topicstarter
Delphi schreef op 28 december 2002 @ 13:16:
Ook als je de handle van je applicatie opgeeft?
Ook dan werkt het helaas niet. Alleen knipperen in de taakbalk

'k ga eerst es even goed de links van elevator doornemen...

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Windows 98 en nieuwer laten een thread niet toe de keyboard focus van een andere thread te stelen. Persoonlijk vind ik dit erg lekker, want ik heb een hekel aan als je lekker aan het coden bent en je blijkt plotseling de helft in een icq bericht gestopt te hebben.

De workaround is de huidige thread te koppelen aan de input thread en dan pas het window naar de voorgrond te halen:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function ForceForegroundWindow(Handle: HWND): Boolean;
var
  Foreground: HWND;
  ForegroundThreadID, ThisThreadID: DWORD;
begin
  Foreground := GetForegroundWindow;
  if Foreground = Handle then
    Result := True
  else begin
    ForegroundThreadID := GetWindowThreadProcessId(Foreground, nil);
    ThisThreadID := GetWindowThreadProcessId(Handle, nil);

    AttachThreadInput(ThisThreadID, ForegroundThreadID, True);
    SetForegroundWindow(Handle);
    AttachThreadInput(ThisThreadID, ForegroundThreadID, False);

    // Return True if the trick worked.
    Result := GetForegroundWindow = Handle;
  end;
end;

We adore chaos because we like to restore order - M.C. Escher


  • jopiek
  • Registratie: September 2000
  • Laatst online: 21-08 19:56

jopiek

Tja... 'ns ff denken.

kun je leuke trojans mee maken overigens >:) heb m'n huisgenoot eens te pakken genomen door een remote applicatie te maken welke notepad bij 'm opende en de toetsaanslagen die ik stuurde vervolgens bij hem in notepad liet zien ;)

Cogito Ergo Credo


Verwijderd

Topicstarter
LordLarry schreef op 28 december 2002 @ 13:26:
De workaround is de huidige thread te koppelen aan de input thread en dan pas het window naar de voorgrond te halen:
Over attachthreadinput las ik ook al wat in de artikelen van Elevator.
En ja. dit is de oplossing. Werkt goed!
Bedankt voor het meedenken
Pagina: 1