Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.039 c
3-1143533737
Dyusha
2006-03-28 12:15
2006.05.28
Экспорт данных в Excel


15-1146506042
БарЛог
2006-05-01 21:54
2006.05.28
Технический англо-русский словарь


15-1146634114
fast2
2006-05-03 09:28
2006.05.28
Как избавится от постоянно всплывающих окон?


1-1145612267
petun[-]
2006-04-21 13:37
2006.05.28
группируем несколько процедур в одну


1-1145450930
Alex_C
2006-04-19 16:48
2006.05.28
Почему прерывается выполнение Thread?