Вывести окно на передний планDelphi , Программа и Интерфейс , Размеры и ПоложениеВывести окно на передний план
Оформил: DeeCo { Windows 98/2000 doesn't want to foreground a window when some other window has the keyboard focus. ForceForegroundWindow is an enhanced SetForeGroundWindow/bringtofront function to bring a window to the front. } { Manchmal funktioniert die SetForeGroundWindow Funktion nicht so, wie sie sollte; besonders unter Windows 98/2000, wenn ein anderes Fenster den Fokus hat. ForceForegroundWindow ist eine "verbesserte" Version von der SetForeGroundWindow API-Funktion, um ein Fenster in den Vordergrund zu bringen. } 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, 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 } // 2. Way: //********************************************** procedure ForceForegroundWindow(hwnd: THandle); // (W) 2001 Daniel Rolf // http://www.finecode.de // rolf@finecode.de var hlp: TForm; begin hlp := TForm.Create(nil); try hlp.BorderStyle := bsNone; hlp.SetBounds(0, 0, 1, 1); hlp.FormStyle := fsStayOnTop; hlp.Show; mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); SetForegroundWindow(hwnd); finally hlp.Free; end; end; // 3. Way: //********************************************** // by Thomas Stutz { As far as you know the SetForegroundWindow function on Windows 98/2000 can not force a window to the foreground while the user is working with another window. Instead, SetForegroundWindow will activate the window and call the FlashWindowEx function to notify the user. However in some kind of applications it is necessary to make another window active and put the thread that created this window into the foreground and of course, you can do it using one more undocumented function from the USER32.DLL. void SwitchToThisWindow (HWND hWnd, // Handle to the window that should be activated BOOL bRestore // Restore the window if it is minimized ); } procedure SwitchToThisWindow(h1: hWnd; x: bool); stdcall; external user32 Name 'SwitchToThisWindow'; {x = false: Size unchanged, x = true: normal size} procedure TForm1.Button2Click(Sender: TObject); begin SwitchToThisWindow(FindWindow('notepad', nil), True); end; Вы предоставили код на языке Pascal, который предназначен для привлечения окна к переднему плану, особенно на Windows 98/2000, где функция Вот три различных способа достижения этого: Метод 1: Использование параметров системы
Этот метод использует функцию Метод 2: Создание временного формы Этот метод создает временное окно с безрамочным стилем и устанавливает его позицию для оставления на переднем плане других окон. Он симулирует левый клик мыши в точке (0,0) и затем освобождает ее. Это трюк предназначен для привлечения окна к переднему плану. Наконец, он освобождает временное окно. Метод 3: Использование не документированной функции
Этот метод использует функцию В предоставленном коде есть комментарии на немецком языке, которые я перевел для вас:
Надеюсь, это поможет! Пожалуйста, дайте мне знать, если у вас есть какие-либо дальнейшие вопросы. В статье описывается проблема вывода окна на передний план в Windows 98/2000, когда другой процесс имеет фокус, и предлагаются три различных способа решения этой проблемы. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: Размеры и Положение ::
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |