AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fenster im Vordergrund

Ein Thema von API · begonnen am 18. Jul 2010 · letzter Beitrag vom 18. Jul 2010
Antwort Antwort
API

Registriert seit: 18. Apr 2004
637 Beiträge
 
#1

Fenster im Vordergrund

  Alt 18. Jul 2010, 14:05
Moin,

Verschiedene Fenster sollen abwechslungsweise im Vordergrund erscheinen.

Ich habe schon alles mögliche versucht - die Fenster erscheinen nicht immer im Vordergrund.

Testweise wurden 2 Notepads geöffnet, welche abwechslungsweise im Vordergrund erscheinen sollen.

Diese Funktionen habe ich schon ausprobiert (auch miteinander kombiniert)

Delphi-Quellcode:
    SetWindowPos(
      hwin,
      HWND_TOP, // HWND_TOPMOST möchte ich jedoch nicht
      0, // horizontal position
      0, // vertical position
      0, // width
      0, // height
      SWP_NOMOVE or SWP_NOSIZE or SWP_SHOWWINDOW);

SwitchToThisWindow SetForeGroundWindow ForceForeGroundWindow BringWindowToTop Bin ratlos und fast am Verzweifeln...

PS: Die Fenster Handles stimmen!

API
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#2

AW: Fenster im Vordergrund

  Alt 18. Jul 2010, 18:13
Versuch es doch einmal mit ForceForegroundWindow.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Berni68

Registriert seit: 9. Jan 2006
Ort: Villingen
162 Beiträge
 
Delphi XE5 Professional
 
#3

AW: Fenster im Vordergrund

  Alt 18. Jul 2010, 19:31
Mit den Fenstern ist es so eine Sache, da war ich auch am verzweifeln.
Mit dieser Funktion aus der Delphi Praxis hab ich so manches Problem gelöst:

Delphi-Quellcode:
function ForceForegroundWindow(hwnd: THandle): Boolean;
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;
Bernhard
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#4

AW: Fenster im Vordergrund

  Alt 18. Jul 2010, 20:30
Geht bei mir auch nicht... Siehe Beispielprojekt.

Relevanter Test-Code:

Delphi-Quellcode:
function Notepad1: HWND;
begin
  Result := FindWindow('Notepad', 'test1.txt - Notepad');
end;

function Notepad2: HWND;
begin
  Result := FindWindow('Notepad', 'test2.txt - Notepad');
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  hNotepad: HWND;
begin
  Inc(i);

  if Odd(i) then
  begin
    hNotepad := Notepad1;
    Caption := 'test1.txt - Notepad sollte im Vordergrund sein.'
  end
  else
  begin
    hNotepad := Notepad2;
    Caption := 'test2.txt - Notepad sollte im Vordergrund sein.'
  end;

  if hNotepad <> 0 then
  begin
    ForceForegroundWindow(hNotepad);
  end;
end;

Nachtrag: So werden die Notepads in den Vordergrund geholt:

Delphi-Quellcode:
  if hNotepad <> 0 then
  begin
    ShowWindow(hNotepad,SW_RESTORE);
    ForceForegroundWindow(hNotepad);
  end;
Angehängte Dateien
Dateityp: zip SetFGWin.zip (201,4 KB, 23x aufgerufen)
Thomas

Geändert von toms (18. Jul 2010 um 20:53 Uhr)
  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 06: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