Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
11-12312
avakss
2003-06-19 10:33
2004.03.05
FTPSERVER


1-12355
DimonNew
2004-02-13 14:13
2004.03.05
word


14-12514
kentavr
2004-01-23 13:43
2004.03.05
Не выключающееся приложение


1-12333
Android
2004-02-22 20:28
2004.03.05
trichedit


7-12559
Sabor
2003-12-16 09:40
2004.03.05
messsage





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский