Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.05;
Скачать: CL | DM;

Вниз

Неукротимое окно???   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
4-12571
fishca
2003-12-30 11:01
2004.03.05
Удаление файла


1-12313
bartram
2004-02-25 18:09
2004.03.05
Как сделать hook на нажатие колёсика мыши?


7-12568
The Vizit0r!
2003-12-12 14:21
2004.03.05
Раскладка клавы


3-12281
Мыш
2004-02-06 20:41
2004.03.05
удаление? записей из запроса


14-12528
DiamondShark
2004-02-11 16:27
2004.03.05
Проверься.