Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#11

AW: Anderem Program den Fokus übergeben

  Alt 8. Jul 2018, 04:24
Ohne gewähr..
Nur getippt nicht getestet.

Delphi-Quellcode:
function GetFocusHandle: HWND;
var
  ForegroundHandle: HWND;
  PID: DWord;
  myThreadID: DWord;
begin

  // Meine ThreadID
  myThreadID := GetCurrentThreadId;
  // Hole das Handle vom Top Level Vordergrund Window
  ForegroundHandle := GetForegroundWindow;
  // Process ID vom Vordergrund Window einlesen
  PID := GetWindowThreadProcessId(ForegroundHandle, nil);
  // diesen Thread und den fremden Thread zusammen fügen
  AttachThreadInput(myThreadID, PID, true);
  // Das Focus Handle
  Result := GetFocus;
  // Threads von einander trennen in dem ich beim dritten wert false übergebe
  AttachThreadInput(myThreadID, PID, false);
end;
man könnte das ganze jetzt noch in einem Loop packen..

Delphi-Quellcode:
  doloop := not doloop;
  repeat
    FocusHwnd := GetFocusHandle;
    application.ProcessMessages;
    Label1.Caption := IntToStr(FocusHwnd);
    Sleep(10)
  until doloop = false;
Nun solltest du mit SetFocus(FocusHwnd) den alten Stand wieder zurück setzen können.
Du kannst aber auch eine Procedure erstellen und verwendest dann anstelle von
Result := GetFocus;
SetForegroundWindow(ForegroundHandle);

Es muss sich aber innerhalb der beiden AttachThreadInputs befinden.
Wenn es jetzt fehlschlägt als Beispiel bei Windows Explorer Ordnern dann kannst du das Parent ermitteln um an das Fensterhandle zu kommen.
Denn hier wird der Focus immer auf das DirectUIHWND gesetzt ist zumindest bei Win7 so.

Bin jetzt aber wirklich raus!
Muss an meinem transparenten TabControl weiterarbeiten.

gruss

Geändert von EWeiss ( 8. Jul 2018 um 05:05 Uhr)
  Mit Zitat antworten Zitat