Как сделать окно активным?

Тема в разделе "WASM.WIN32", создана пользователем BreakPointMAN, 29 май 2006.

  1. lieut

    lieut New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2006
    Сообщения:
    1
    Кусок кода, найденного в исходниках &RQ. Вроде работает

    Код (Text):
    1. function ForceForegroundWindow(hwnd: THandle; doRestore: boolean = TRUE): boolean;
    2. const
    3.   SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
    4.   SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
    5. var
    6.   ForegroundThreadID: DWORD;
    7.   ThisThreadID: DWORD;
    8.   timeout: DWORD;
    9. begin
    10.   result := FALSE;
    11.   if IsIconic(hwnd) and isWindowVisible(hwnd) then
    12.     if doRestore then
    13.       ShowWindow(hwnd, SW_RESTORE)
    14.     else
    15.       exit;
    16.  
    17.   if GetForegroundWindow = hwnd then
    18.     begin
    19.       result := TRUE;
    20.       exit;
    21.     end;
    22.   // Windows 98/2000 doesn't want to foreground a window when some other
    23.   // window has keyboard focus
    24.   if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion > 4)) or
    25.     ((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and
    26.     ((Win32MajorVersion > 4) or ((Win32MajorVersion = 4) and
    27.     (Win32MinorVersion > 0)))) then
    28.     begin
    29.       ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow, nil);
    30.       ThisThreadID := GetWindowThreadPRocessId(hwnd, nil);
    31.       if AttachThreadInput(ThisThreadID, ForegroundThreadID, true) then
    32.         begin
    33.           BringWindowToTop(hwnd); // IE 5.5 related hack
    34.           SetForegroundWindow(hwnd);
    35.           AttachThreadInput(ThisThreadID, ForegroundThreadID, false);
    36.         end;
    37.       if GetForegroundWindow <> hwnd then
    38.         begin
    39.           SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @timeout, 0);
    40.           SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, nil, SPIF_SENDCHANGE);
    41.           BringWindowToTop(hwnd); // IE 5.5 related hack
    42.           SetForegroundWindow(hWnd);
    43.           SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(timeout), SPIF_SENDCHANGE);
    44.         end;
    45.     end
    46.   else
    47.     begin
    48.       BringWindowToTop(hwnd); // IE 5.5 related hack
    49.       SetForegroundWindow(hwnd);
    50.     end;
    51.   Result := (GetForegroundWindow = hwnd);
    52. end; // ForceForegroundWindow