![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как установить Focus окна [D7, WinXP]
ArtemESC © (2005-09-18 21:17:00)SetFocus(Handle) - не помогает...
Джо (2005-09-19 15:40:00) [1][3] Игорь Шевченко © (19.09.05 00:18)
[4] Lamer@fools.ua © (19.09.05 08:48)
Я уточнял вопрос у автора ветки. Как я и предполагал, имелось в виду "нечто другое" :)
ANB (2005-09-19 10:42:00) [2]Активность окна и фокус - суть разные вещи.
Фокус более меннее гарантировано ставится SetFocus или WM_SETFOCUS (иногда второе работает надежнее), но АКТИВНЫМ окно от этого не станет.
Вообще то MS старательно борется с этой возможностью от версии к версии, но вот процедурка, которая делает окно верхним/активным :
function GetMainWindow (hWindow : THandle) : THandle;
var hMainWindow, hW : THandle;
begin
hMainWindow := hWindow;
hW := hWindow;
repeat
hW := GetParent(hW);
if (hW <> 0)
then hMainWindow := hW;
until (hW = 0);
Result := hMainWindow;
end;
procedure Set_Foreground_Window (hWindow : THandle);
var dwTimeout : DWord;
hMainWindow, hFGW, hMDIClient : THandle;
begin
if (hWindow = 0) then Exit;
// Получим главное окно
hMainWindow := GetMainWindow(hWindow);
// Узнаем какое окно сейчас наверху
hFGW := GetForegroundWindow;
// Если не наше - будем поднимать
if (hMainWindow <> hFGW) then begin
// Отключим моргание вместо подъема окна
SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @dwTimeout, 0);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, nil, 0);
try
// Попробуем разными способами поднять окно
SendMessage(GetDesktopWindow(), WM_SYSCOMMAND, SC_HOTKEY, hMainWindow);
SwitchToThisWindow(hMainWindow, True);
SetForegroundWindow(hMainWindow);
// Для MDI окон
if (hWindow <> hMainWindow) then begin
// Найдем MDI Client
hMDIClient := FindWindowEx(hMainWindow, 0, 'MDIClient', '');
// Пошлем ему сообщение WM_MDIACTIVATE
SendMessage(hMDIClient, WM_MDIACTIVATE, hWindow, 0);
end;
finally
// Восстановим моргание
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, @dwTimeout, 0);
end;
end;
end;
ЗЫ 1. Использовать Set_Foreground_Window
ЗЫ 2. Возможно, процедурка не оптимальна
ЗЫ 3. А зачем это нужно ?
ЗЫ 4. Телепаты еще не проснулись, формулируй вопрос грамотнее
ArtemESC (2005-09-19 09:05:00) [3]Не ребят не помогает...
У меня окно создается динамически, через функции API.
Окно отображется, но фокус не устанавилваеться.
Фокус - активность данного окна.
Lamer@fools.ua (2005-09-19 08:48:00) [4]>> Джо © (18.09.05 23:43) [2]
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1126895306&n=3
Игорь Шевченко (2005-09-19 00:18:00) [5]Джо © (18.09.05 23:43) [2]
> Вероятно, под "фокусом" понимается нечто другое. Может,
> активность приложения?
Или наводка изображения монитора на резкость ?
Джо (2005-09-18 23:43:00) [6]Вероятно, под "фокусом" понимается нечто другое. Может, активность приложения? Бгъ знаетъ.
Игорь Шевченко (2005-09-18 23:35:00) [7]помогает