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

Вниз

Как установить 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 вся ветка

Текущий архив: 2005.11.20;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.042 c
2-1130604578
Arazel
2005-10-29 20:49
2005.11.20
Преобразование Width в Length


1-1130510277
BFG9k
2005-10-28 18:37
2005.11.20
Что происходит между OnClose и OnDestroy ?


3-1128938404
Boogier
2005-10-10 14:00
2005.11.20
Delphi+Ado+Access+Действительное поле = несоответствие типов данн


14-1130740490
pavel_guzhanov
2005-10-31 09:34
2005.11.20
Книга Марко Кэнту


14-1130510162
Копир
2005-10-28 18:36
2005.11.20
Средне-статистический респондент на конфе "Потрепать себя".