Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


serg700
Давай пробовать .

Значит есть такая WinAPI-функция TrackMouseEvent,которая способна следить за состоянием курсора и отправлять соответствующие сообщения.Эти сообщения будут приниматься и обрабатываться с помощью функции WindowProc приложения.
Функция TrackMouseEvent принимает в качестве параметра указатель на структуру TRACKMOUSEEVENT,заполняя которую мы указываем особенности слежения за курсором.

Итак,нам понадобится создать функцию,обрабатывающую различные сообщения, - WindowProc:

Код: Выделить весь код
var
 Hovering : Boolean; // переменная типа Boolean,которая сигнализирует о зависании курсора
 TME : TTrackMouseEvent;
function WindowProc(hWnd : HWND; uMsg : UINT; wParam : WPARAM;
                    lParam : LPARAM) : LRESULT; stdcall;
begin
 Result := DefWindowProc(hWnd, uMsg, wParam, lParam); 
 
if uMsg = WM_MOUSEMOVE then
begin
 { Заполняем структуру TRACKMOUSEEVENT }

 TME.cbSize := SizeOf(TME);
 TME.dwFlags := TME_HOVER; // Вариант с зависанием курсора
 TME.hwndTrack := hWnd; // Описатель,который используется первым параметром в WindowProc
 TME.dwHoverTime := 3000; // три секунды зависания
 TrackMouseEvent(TME); // Вызываем саму функцию

if Hovering then // Если курсор зависал и был спрятан,
begin
 ShowCursor(True);  // то показываем его
 Hovering := False;
 end;
end; // uMsg = WM_MOUSEMOVE

if uMsg = WM_MOUSEHOVER then // Если поступает сообщение
begin                                                        // о зависании курсора,то
 Hovering := True;                                              // прячем его
 ShowCursor(False);
end; // uMsg = WM_MOUSEHOVER

end; // WindowProc
Функция TrackMouseEvent словно бы одноразовая,т.е. сгенерировав одно сообщение,она перестаёт функционировать,поэтому её необходимо каждый раз запускать заново.Именно поэтому я поставил её инициацию в обработчик сообщения передвижения курсора (WM_MOUSEMOVE) .

P.S. Я точно не уверен возможно ли таким образом реализовать функцию WindowProc на чистом Delphi,т.е. с применением всяких там VCL и т.п.
Я это делал на примере минимального Delphi-приложения,где используется только WinAPI.
P.P.S. Вероятно описанная WindowProc не является полнофункциональной,т.к. я старался объяснить только принцип актуального вопроса.

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 14:21, 13-03-2006 | #60