![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как обойти ограничения на получения формой, фокуса ввода в K2/XP
Федор Т © (2004-05-26 23:57:00)Как обойти ограничения на получения формой, фокуса ввода в 2000/ХР виндах?
Собственно по сабжу:
Известно, что для перемещения окна на передний план существует функция SetForegroundWindow из Win32 API . Она отлично работала под Windows 95 и Window NT. Но потом парни из Майкрософт провозгласили новый принцип: "Никто кроме пользователя не имеет право выдвигать окно на передний план". И хотя их собственные продукты продолжают делать это при необходимости, функция SetForegroundWindow перестала работать, как раньше. Теперь только активный процесс (foreground process) может переместить окно на передний план с использовании этой функции, а окно фонового процесса начнёт "мерцать" на панели задач, чтобы привлечь внимание пользователя.
Функции:
SwitchToThisWindow)(HWND, BOOL);
SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, &dwTimeout, 0);
procedure SwitchToThisWindow(wnd : HWND; bRestore: BOOL); stdcall;
дают аналогичный результат, что и SetForegroundWindow
BlackTr (2004-05-27 09:25:00) [1]
function SetForegroundWindow98(const Wnd: HWND): Boolean;
var
ForeThreadID, NewThreadID: DWORD;
begin
if GetForegroundWindow <> Wnd then
begin
ForeThreadID := GetWindowThreadProcessId(GetForegroundWindow, nil);
NewThreadID := GetWindowThreadProcessId(Wnd, nil);
if ForeThreadID <> NewThreadID then
begin
AttachThreadInput(ForeThreadID, NewThreadID, True);
Result := SetForegroundWindow(Wnd);
AttachThreadInput(ForeThreadID, NewThreadID, False);
if Result then
Result := SetForegroundWindow(Wnd);
end
else
Result := SetForegroundWindow(Wnd);
end
else
Result := True;
end;
Федор Т (2004-05-27 00:33:00) [2]Cobalt © (27.05.04 00:12) [1]
окно наверх выводит, а фокус ввода не дает.
В том то и есть ограничения 2000/ХР
Cobalt (2004-05-27 00:12:00) [3]А SetFocus не работает?