Форум: "WinAPI";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
ВнизКак установить Focus окна Найти похожие ветки
← →
ArtemESC © (2005-09-18 21:17) [0]SetFocus(Handle) - не помогает...
← →
Игорь Шевченко © (2005-09-18 23:35) [1]помогает
← →
Джо © (2005-09-18 23:43) [2]Вероятно, под "фокусом" понимается нечто другое. Может, активность приложения? Бгъ знаетъ.
← →
Игорь Шевченко © (2005-09-19 00:18) [3]Джо © (18.09.05 23:43) [2]
> Вероятно, под "фокусом" понимается нечто другое. Может,
> активность приложения?
Или наводка изображения монитора на резкость ?
← →
Lamer@fools.ua © (2005-09-19 08:48) [4]>>Джо © (18.09.05 23:43) [2]
http://delphimaster.net/view/15-1126895306/
← →
ArtemESC © (2005-09-19 09:05) [5]Не ребят не помогает...
У меня окно создается динамически, через функции API.
Окно отображется, но фокус не устанавилваеться.
Фокус - активность данного окна.
← →
ANB © (2005-09-19 10:42) [6]Активность окна и фокус - суть разные вещи.
Фокус более меннее гарантировано ставится 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. Телепаты еще не проснулись, формулируй вопрос грамотнее
← →
Джо © (2005-09-19 15:40) [7][3] Игорь Шевченко © (19.09.05 00:18)
[4] Lamer@fools.ua © (19.09.05 08:48)
Я уточнял вопрос у автора ветки. Как я и предполагал, имелось в виду "нечто другое" :)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.049 c