Форум: "Основная";
Текущий архив: 2004.03.05;
Скачать: [xml.tar.bz2];
ВнизНеукротимое окно??? Найти похожие ветки
← →
Alex_DM (2004-02-24 17:18) [0]Уважаемые Мастера!!!
Не получается переместить окно первой копии программы на передний план при запуске второй.
При завершении второй копии программы в первую посылается сообщение:
SendMessage(Wnd, WM_COPYDATA, 0, LParam(@cd));
с данными командной строки.
Обработчик этого сообщения описан ниже. Результат: мигает кнопка на панели задач, а само окно остается на заднем плане. В чем дело???
type
TfrmParent = class(TForm)
...
private
procedure ReceiveMessage (var Msg: TMessage); message WM_COPYDATA;
end;
...
procedure TfrmParent.ReceiveMessage(var Msg: TMessage);
var
pcd : PCopyDataStruct;
begin
pcd := PCopyDataStruct(Msg.LParam);
/// !!!!!!!!!!!!!!!!!!!!
ShowWindow(Application.Handle, SW_RESTORE);
BringWindowToTop(Application.Handle);
SetForegroundWindow(Application.Handle);
Show;
// ?????????????????????????
...
end;
← →
Anatoly Podgoretsky (2004-02-24 17:23) [1]В операционной системе, Билл руки выкрутил любителям всплывать на первый план и народ с ним очень согласен.
← →
Alex_DM (2004-02-24 17:28) [2]А никак нельзя выкрутить руки Биллу??? :)
Самое интересное что тот же самый код
ShowWindow(Application.Handle, SW_RESTORE);
BringWindowToTop(Application.Handle);
SetForegroundWindow(Application.Handle);
Show;
при вызове его из всплывающего меню программы в SysTray проходит на ура (окно перемещается на передний план даже если оно свернуто и скрыто).
В чем разница то?
← →
Alex_DM (2004-02-24 17:37) [3]Существуют какие либо силовые методы активизации окна?
← →
Anatoly Podgoretsky (2004-02-24 17:43) [4]Существуют, но также существуют и методы по избавлению от этого недостатка.
← →
DDA (2004-02-24 17:43) [5]Взято с форума:
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 }
← →
jack128 (2004-02-24 17:44) [6]что нить типа этого должно сработать..
const wm_temp = wm_user + 101;
type
TfrmParent = class(TForm)
...
private
procedure ReceiveMessage (var Msg: TMessage); message WM_COPYDATA;
procedure WmTemp (var Msg: TMessage); message WM_TEMP;
end;
procedure TfrmParent.ReceiveMessage(var Msg: TMessage);
var
pcd : PCopyDataStruct;
begin
pcd := PCopyDataStruct(Msg.LParam);
PostMessage(Self.Handle, wm_temp, 0, 0);
end;
procedure TfrmParent.WmTemp(var Msg: TMessage);
begin
ShowWindow(Application.Handle, SW_RESTORE);
BringWindowToTop(Application.Handle);
SetForegroundWindow(Application.Handle);
Show;
end;
← →
Alex_DM (2004-02-24 17:59) [7]> jack128
НЕ прокатило... :(
← →
Alex_DM (2004-02-24 18:08) [8]> DDA
Огромное спасибо!!! Все вроде бы работает (пока :) Осталось только разобраться как... :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.03.05;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c