Главная страница
    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
3-12228
Pako
2004-02-06 17:52
2004.03.05
SQL


4-12581
brat
2003-12-30 21:49
2004.03.05
В трей запихал , а как вытащить обратно?


1-12338
snake7
2004-02-22 16:00
2004.03.05
Вопрос о шифровании


1-12385
DarkBox
2004-02-25 07:14
2004.03.05
StayOnTop


14-12509
kaif
2004-02-12 00:02
2004.03.05
---|Ветка была без названия|---





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский