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 SetForegroundWindow bringt das Fenster nicht nach vorn (https://www.delphipraxis.net/47185-setforegroundwindow-bringt-das-fenster-nicht-nach-vorn.html)

thomasch 7. Jun 2005 14:56


SetForegroundWindow bringt das Fenster nicht nach vorn
 
Hallo,
nachdem ich AutoCAD mit windows.SetForegroundWindow(acadapp.HWND); in den Vordergrund gebracht habe, möchte ich in einer anderen Funktion meine Anwendung wieder nach vorn bringen.
Delphi-Quellcode:
 
  application.Restore;
  windows.SetForegroundWindow(self.Handle);
  self.BringToFront;
führt jetzt aber nur dazu, dass der Eintrag meines Programms in der Taskleiste blinkt (übrigens, nach beenden des Programms auch der von D7, sofern es im Hintergrund liegt).

Muss ich damit leben (wär schlecht) oder geht das irgendwie (wär gut)?

Danke schonmal

Thomasch

toms 7. Jun 2005 15:07

Re: SetForegroundWindow bringt das Fenster nicht nach vorn
 
Hallo!

Probier's mal damit:

Delphi-Quellcode:
function ForceForegroundWindow(hwnd: THandle): WordBool;
const
  SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
  SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
var
  ForegroundThreadID: DWORD;
  ThisThreadID: DWORD;
  timeout: DWORD;
begin
  if IsIconic(hwnd) then ShowWindow(hwnd, SW_RESTORE);

  if GetForegroundWindow = hwnd then Result := True
  else
  begin
    // Windows 98/2000 doesn't want to foreground a window when some other
    // window has keyboard focus

    if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion > 4)) or
      ((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and
      ((Win32MajorVersion > 4) or ((Win32MajorVersion = 4) and
      (Win32MinorVersion > 0)))) then
    begin
      // Code from Karl E. Peterson, [url]www.mvps.org/vb/sample.htm[/url]
      // Converted to Delphi by Ray Lischner
      // Published in The Delphi Magazine 55, page 16 

      Result := False;
      ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow, nil);
      ThisThreadID := GetWindowThreadPRocessId(hwnd, nil);
      if AttachThreadInput(ThisThreadID, ForegroundThreadID, True) then
      begin
        BringWindowToTop(hwnd); // IE 5.5 related hack
        SetForegroundWindow(hwnd);
        AttachThreadInput(ThisThreadID, ForegroundThreadID, False);
        Result := (GetForegroundWindow = hwnd);
      end;
      if not Result then
      begin
        // Code by Daniel P. Stasinski
        SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @timeout, 0);
        SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0),
          SPIF_SENDCHANGE);
        BringWindowToTop(hwnd); // IE 5.5 related hack
        SetForegroundWindow(hWnd);
        SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(timeout), SPIF_SENDCHANGE);
      end;
    end
    else
    begin
      BringWindowToTop(hwnd); // IE 5.5 related hack
      SetForegroundWindow(hwnd);
    end;

    Result := (GetForegroundWindow = hwnd);
  end;
end; { ForceForegroundWindow }

MacGuyver 3. Feb 2011 09:45

AW: SetForegroundWindow bringt das Fenster nicht nach vorn
 
Moin Leute :hi:

Ich habe Toms Lösung ausprobiert und mein Fenster kam nicht immer in den Vordergrund. Mittels http://www.delphipraxis.net/451409-post7.html klappt das.
Mal sehen, was die Praxis bringt, ob sich noch Kunden beschweren, dass die erst mit Alt-Tab wechseln müssen um die Meldung zu sehen.

Stefan

Dezipaitor 3. Feb 2011 09:51

AW: SetForegroundWindow bringt das Fenster nicht nach vorn
 
Das ist Absicht!
Schau mal die Doku dazu an SetForegroundWindow:

Zitat:

The system restricts which processes can set the foreground window. A process can set the foreground window only if one of the following conditions is true:

* The process is the foreground process.
* The process was started by the foreground process.
* The process received the last input event.
* There is no foreground process.
* The foreground process is being debugged.
* The foreground is not locked (see LockSetForegroundWindow).
* The foreground lock time-out has expired (see SPI_GETFOREGROUNDLOCKTIMEOUT in SystemParametersInfo).
* No menus are active.



Alle Zeitangaben in WEZ +1. Es ist jetzt 08:18 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