AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Handle des Fensters, das den Fokus hat!
Thema durchsuchen
Ansicht
Themen-Optionen

Handle des Fensters, das den Fokus hat!

Ein Thema von bayo · begonnen am 19. Aug 2003 · letzter Beitrag vom 19. Aug 2003
Antwort Antwort
bayo

Registriert seit: 19. Aug 2003
Ort: ch
15 Beiträge
 
Delphi 5 Enterprise
 
#1

Handle des Fensters, das den Fokus hat!

  Alt 19. Aug 2003, 11:33
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
  Mit Zitat antworten Zitat
Alexander

Registriert seit: 28. Aug 2002
Ort: Oldenburg
3.513 Beiträge
 
Turbo Delphi für .NET
 
#2

Re: Handle des Fensters, das den Fokus hat!

  Alt 19. Aug 2003, 11:38
Mit der API GetForeGroundWindow() geht das.
Hatten wir aber auch schon
Alexander
  Mit Zitat antworten Zitat
MatthiasW

Registriert seit: 29. Jan 2003
Ort: Reichenbach
253 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Handle des Fensters, das den Fokus hat!

  Alt 19. Aug 2003, 11:44
Hallo,

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

Mfg Matthias
  Mit Zitat antworten Zitat
MatthiasW

Registriert seit: 29. Jan 2003
Ort: Reichenbach
253 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Handle des Fensters, das den Fokus hat!

  Alt 19. Aug 2003, 11:46
Hallo,

sorry, ich hatte Focus überlesen.

Mfg Matthias
  Mit Zitat antworten Zitat
Benutzerbild von Stanlay Hanks
Stanlay Hanks

Registriert seit: 1. Mär 2003
2.078 Beiträge
 
Delphi 2005 Professional
 
#5

Re: Handle des Fensters, das den Fokus hat!

  Alt 19. Aug 2003, 11:46
Zitat von bayo:
Auch mit GetForegroundWindow und GetActiveWindow geben mir falsche Handles zurück!
Zitat von Alexander:
Mit der API GetForeGroundWindow() geht das.
Hatten wir aber auch schon
Er hat doch gesagt, dass es mit GetForeGroundWindow nicht geht.
Was ich allerdings nicht verstehe, weil diese Funktion doch genau für diesen Zweck da is, oder?

Man liest sich, Stanlay

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

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#6

Re: Handle des Fensters, das den Fokus hat!

  Alt 19. Aug 2003, 11:48
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
  Mit Zitat antworten Zitat
Alexander

Registriert seit: 28. Aug 2002
Ort: Oldenburg
3.513 Beiträge
 
Turbo Delphi für .NET
 
#7

Re: Handle des Fensters, das den Fokus hat!

  Alt 19. Aug 2003, 11:50
Upps
Da hatte ich nciht mehr weitergelesen

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...
Alexander
  Mit Zitat antworten Zitat
bayo

Registriert seit: 19. Aug 2003
Ort: ch
15 Beiträge
 
Delphi 5 Enterprise
 
#8

Re: Handle des Fensters, das den Fokus hat!

  Alt 19. Aug 2003, 13:15
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
  Mit Zitat antworten Zitat
bayo

Registriert seit: 19. Aug 2003
Ort: ch
15 Beiträge
 
Delphi 5 Enterprise
 
#9

Re: Handle des Fensters, das den Fokus hat!

  Alt 19. Aug 2003, 15:43
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
  Mit Zitat antworten Zitat
bayo

Registriert seit: 19. Aug 2003
Ort: ch
15 Beiträge
 
Delphi 5 Enterprise
 
#10

Re: Handle des Fensters, das den Fokus hat!

  Alt 19. Aug 2003, 16:38
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:16 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