Текущий архив: 2006.05.28;
Скачать: CL | DM;
Внизtwm as AttachThreadInput Найти похожие ветки
← →
Axis_of_Evil © (2006-02-28 13:38) [0]пытался ради интереса реализовать в Windows функциональность как в twm, т.е. фокусировку ввода на том окне, над которым висить курсор.
реализвал ето так:
procedure TMainForm.FormCreate(Sender: TObject);
begin
hDesktop := GetDeskTopWindow;
hPrevWindow := 0;
OutList.Items.Add("found DesktopWindow at " + IntToStr(hDesktop));
SystemParametersInfo(SPI_SETFOREGROUNDFLASHCOUNT, 0, nil, 0);
end;
procedure TimerProc(uTimerID, uMessage: UINT; dwUser, dw1, dw2: DWORD); stdcall;
//var
// hChildWindow: hwnd;
begin
GetCursorPos(CurPos);
hWindow := ChildWindowFromPointEx(hDesktop, CurPos, cwp_SkipInvisible{ or cwp_SkipDisabled});
if (hPrevWindow <> hWindow) then
begin
// hChildWindow := ChildWindowFromPointEx(hWindow, CurPos, cwp_SkipInvisible{ or cwp_SkipDisabled});
SetForegroundWindow(hWindow);
// SetFocus(hChildWindow);
/// if (hPrevWindow <> 0) then
// AttachThreadInput(GetWindowThreadProcessId(hPrevWindow), GetCurrentThreadId, False);
AttachThreadInput(GetWindowThreadProcessId(hWindow), GetCurrentThreadId, True);
hPrevWindow := hWindow;
end;
end;
// вроде работает
вот только корректно ли это?
Рихтер (вообще кодилось и читалось давно -> могу ошибаться),
вроде говорил, что неправлильно аттачить всех к одному потоку
// а в данном случае, вроде, это и делается
0) как учинить преследуемую цель болле правильно?
1) кто-нибудь, если не лень, объяснит, чего на уровне ОС творится, когда срабатывает мой код? // RIT, etc
← →
Сергей М. © (2006-02-28 14:04) [1]Сначала объясни самому себе, причем здесь таймер ..
← →
Axis_of_Evil © (2006-02-28 14:13) [2]>Сначала объясни самому себе, причем здесь таймер ..
тому что хук ставить ломало
не в этом вопрос
← →
Сергей М. © (2006-02-28 14:46) [3]
> не в этом вопрос
Тогда обозначь критерий "правильности" (см. "как учинить преследуемую цель болле правильно")
← →
Axis_of_Evil © (2006-03-03 16:22) [4]Ъ, я имею ввиду "корректен ли код? не приводит ли он к неверной работе системы, etc?"
GetCursorPos(CurPos);
hWindow := ChildWindowFromPointEx(hDesktop, CurPos, cwp_SkipInvisible);
if (hPrevWindow <> hWindow) then
begin
SetForegroundWindow(hWindow);
AttachThreadInput(GetWindowThreadProcessId(hWindow), GetCurrentThreadId, True);
hPrevWindow := hWindow;
end;
Страницы: 1 вся ветка
Текущий архив: 2006.05.28;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.035 c