Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Handle des Fensters, das den Fokus hat! (https://www.delphipraxis.net/7689-handle-des-fensters-das-den-fokus-hat.html)

bayo 19. Aug 2003 10:33


Handle des Fensters, das den Fokus hat!
 
Hi zusammen...

Ich probiere irgendwie das Handle des Fensters, das den Fokus hat, herauszufinden! Die funktion GetFocus funktioniert nur innerhalb der eigenen Anwendung! Ich müsste das Handle des "fokusierten" Fensters der aktiven Anwendung haben, egal welche Anwendung aktiv ist! Hm, ich hoffe ihr versteht, was ich meine!? Auch mit GetForegroundWindow und GetActiveWindow geben mir falsche Handles zurück!

Grüsse und vielen Dank.. Dominic

Alexander 19. Aug 2003 10:38

Re: Handle des Fensters, das den Fokus hat!
 
Mit der API GetForeGroundWindow() geht das.
Hatten wir aber auch schon ;-)

MatthiasW 19. Aug 2003 10:44

Re: Handle des Fensters, das den Fokus hat!
 
Hallo,

du könntest natürlich auch mit "GetParentForm" das übergeordnete Form ermitteln und dann die Eigeschaft Handle abfragen.

Mfg Matthias

MatthiasW 19. Aug 2003 10:46

Re: Handle des Fensters, das den Fokus hat!
 
Hallo,

sorry, ich hatte Focus überlesen.

Mfg Matthias

Stanlay Hanks 19. Aug 2003 10:46

Re: Handle des Fensters, das den Fokus hat!
 
Zitat:

Zitat von bayo
Auch mit GetForegroundWindow und GetActiveWindow geben mir falsche Handles zurück!

Zitat:

Zitat von Alexander
Mit der API GetForeGroundWindow() geht das.
Hatten wir aber auch schon :hi:

Er hat doch gesagt, dass es mit GetForeGroundWindow nicht geht. :wink:
Was ich allerdings nicht verstehe, weil diese Funktion doch genau für diesen Zweck da is, oder?

Man liest sich, Stanlay :hi:

[Edit]
@Alex Sorry. Hab mich verlesen. Du hast ja was anderes als er geschrieben. Nimms mir bitte nicht übel :oops:

teebee 19. Aug 2003 10:48

Re: Handle des Fensters, das den Fokus hat!
 
Vielleicht probierst Du es mal mit AttachThreadInput. Damit ermöglichst Du Deinem Thread, den Focus eines Fensters in einem fremden Thread zu setzen und abzufragen. Hole Dir zuerst das Handle des ForegroundWindows, und dann mit GetWindowThreadProcessID dessen ThreadID.
Deine eigene ThreadId bekommst Du mit GetCurrentThreadID.

Ich hab das allerdings noch nie ausprobiert, ohne Gewähr...

Ciao, teebee

Alexander 19. Aug 2003 10:50

Re: Handle des Fensters, das den Fokus hat!
 
Upps :oops:
Da hatte ich nciht mehr weitergelesen :mrgreen:

Aber eigentlich sollte es funktionieren.
Poste mal den relevanten Source oder die Umstände unter denen du den Code ausführst.
Vielleicht verliert das Fenster ja den Fokus wieder? Z.b. durch einen Mausklick...

bayo 19. Aug 2003 12:15

Re: Handle des Fensters, das den Fokus hat!
 
Vielen Dank für eure Antworten!

Folgend ein Modell meines Problems:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    hFocusedWnd: HWND;
    procedure WMHotKey(var Msg : TWMHotKey); message WM_HOTKEY;
  end;

const
  FOCUSEDWND_HOTKEY = 101;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  RegisterHotKey(Handle, FOCUSEDWND_HOTKEY, MOD_CONTROL, Ord('N'));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnregisterHotKey(Handle, FOCUSEDWND_HOTKEY);
end;

procedure TForm1.WMHotKey(var Msg : TWMHotKey);
begin
  Case Msg.HotKey of
    FOCUSEDWND_HOTKEY: hFocusedWnd := GetFocus;
  end;
end;

end.
GetForegroundWindow gibt das Handle des vordersten Formulars zurück und nicht des Fensters, das effektiv den eingabefokus hat! GetFocus wäre schön die richtige funktion, sie funktioniert aber nur innerhalb des Threads, der sie aufruft! Der Ansatz von teebee hört sich daher gut an :) Werde hier noch ein feedback geben!

Grüsse Dominic

bayo 19. Aug 2003 14:43

Re: Handle des Fensters, das den Fokus hat!
 
Hm, irgendwie bringe ich das ganze nicht zum laufen :(

Habe meinen Code wie folgt abgeändert:

Delphi-Quellcode:
procedure TForm1.WMHotKey(var Msg : TWMHotKey);
var
  attach, attachTo: Cardinal;
begin
  Case Msg.HotKey of
    FOCUSEDWND_HOTKEY: begin
      attach := GetWindowThreadProcessID(GetForegroundWindow, nil);
      attachTo := GetCurrentThreadId;
      AttachThreadInput(attach, attachTo, True);
      hFocusedWnd := GetFocus;
      SetWindowText(hFocusedWnd, PChar('Test'));
      AttachThreadInput(attach, attachTo, False);
    end;
  end;
end;
Problem: Wenn das Fenster, das den Eigabefokus hat, nicht von dem Thread erzeugt wurde, der die GetFocus ausführt, ist der Rückgabewert dieser Funktion 0. Ich habe gahofft (bzw. Idee von teebee), dass durch das "verbinden" der beiden beteiligten Threads GetFocus funktioniert und somit das richtige Fensterhandle zurückgegeben wird. Leider ist der Rückgabewert immer noch 0 :( Vielleicht hät jemand noch eine idee, wie man das umgehen könnte!?

Grüsse und vielen Dank... Dominic

bayo 19. Aug 2003 15:38

Re: Handle des Fensters, das den Fokus hat!
 
Hm, irgendwie funktioniert das ja doch:

Delphi-Quellcode:
procedure TForm1.WMHotKey(var Msg : TWMHotKey);
var
  attach, attachTo: Cardinal;
  value: String;
begin
  Case Msg.HotKey of
    FOCUSEDWND_HOTKEY: begin
      attach := GetWindowThreadProcessId(GetForegroundWindow, nil);
      attachTo := GetCurrentThreadId;
      if AttachThreadInput(attach, attachTo, True) then begin
        hFocusedWnd := GetFocus;
        AttachThreadInput(attach, attachTo, False);
      end else begin
        hFocusedWnd := GetFocus;
      end;
      value := 'Test';
      SendMessage(hFocusedWnd, WM_SETTEXT, 0, Integer(@value[1]));
    end;
  end;
end;
SetWindowText funktioniert nicht bei Fenstern, die nicht vom selben Thread erzeugt wurden! Ich habe einfach angenommen, dass das problem immer noch beim Handle liegt! Mein fehler :(

Vielen Dank für eure Hilfe!

Dominic


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz