Entwickler-Ecke

Windows API - Programm in den Vordergrund bringen


Eagle-Data - Do 12.08.04 08:19
Titel: Programm in den Vordergrund bringen
Hallo,

ich hab ein Programm im Systray hängen. (Oder auch in der Taskleiste) Bei einer bestimmten Aktion soll das Programm in den Vordergrund (über alle anderen Programme) kommen. Kann mir einer sagen wie das geht?

Ich habs schon probiert mit:


Delphi-Quelltext
1:
SendMessage(Form1.Handle, WM_ACTIVATE, WA_ACTIVE, 0);                    

sowie

Delphi-Quelltext
1:
form1.SetFocus;                    

und

Delphi-Quelltext
1:
SetForeGroundWindow(form1.Handle);                    


Danke


Eagle-Data - Do 12.08.04 08:23
Titel: Ich habs
Hi,

ich habs gelöst. Mit ner Lösung aus dem Forum ;-) Sorry


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
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 > 4or ((Win32MajorVersion = 4and  
      (Win32MinorVersion > 0)))) then  
    begin  
      // Code from Karl E. Peterson, www.mvps.org/vb/sample.htm  
      // 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 }


NeWsOfTzzz - Do 12.08.04 09:17

Also wenn es auch in der Taskleiste sein kann, musst du noch Application.Restore; benutzen... Danach hab ich in meinem Thread net gefragt weil ich dat schon wusste hab ja schliesslich erstmal lange probiert in der Hilfe was zu finden...
Und wenn dann das Programm in der Taskleiste ist fokussiert Restore das Programm sogar, aber leider nicht wenn es nicht in der Taskleiste ist, dann mach Restore nämlich gar nix...