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

Вниз

Средняя кнопка мыши   Найти похожие ветки 

 
Ramario ©   (2004-01-14 12:38) [0]

Здравствуйте, подскажите как уловить нажатие средней кнопки мыши
за пределами приложения.


 
Юрий Зотов ©   (2004-01-14 12:40) [1]

Так же, как и всех остальных - либо SetCapture, либо глобальным хуком. Второе надежнее.


 
Ramario ©   (2004-01-14 12:55) [2]

Это понятно,но как точно это сделать?


 
Юрий Зотов ©   (2004-01-14 13:02) [3]

> Ramario © (14.01.04 12:55) [2]

Найти примеры. Почитать документацию. Написать правильный код. Вот и все.

Начните с хелпа по WinAPI(нужны разделы SetWindowsHookEx, MouseProc, MOUSEHOOKSTRUCT, CallNextHookEx и UnhookWindowsHookEx). Потом на этом сайте в разделе "статьи" найдите статью Алексея Павлова по работе с хуками и проштудируйте ее.

После этого все остальное делается за полчаса.


 
Ramario ©   (2004-01-14 13:54) [4]

Может тот кто это уже проделал
подскажет мне, чтоб я не мучался


 
NAlexey ©   (2004-01-14 14:02) [5]


WHook := SetWindowsHookEx(WH_MOUSE, @CallWndProcHook, 0, GetCurrentThreadId);

function CallWndProcHook(Code: Integer; wParam: WParam; lParam: LParam): LRESULT; stdcall;
var
Res: HRESULT;

function LeftButtonPressed: Boolean;
begin
if GetSystemMetrics(SM_SWAPBUTTON) = 0 then
Result := GetAsyncKeyState(VK_LBUTTON) < 0
else
Result := GetAsyncKeyState(VK_RBUTTON) < 0;
end;

function RightButtonPressed: Boolean;
begin
if GetSystemMetrics(SM_SWAPBUTTON) = 0 then
Result := GetAsyncKeyState(VK_RBUTTON) < 0
else
Result := GetAsyncKeyState(VK_LBUTTON) < 0;
end;

function StructToMessage: TMsg;
begin
Result.HWnd := PMouseHookStruct(lParam)^.hwnd;
Result.message := wParam;
Result.wParam :=
Byte(GetAsyncKeyState(VK_CONTROL) < 0) * MK_CONTROL +
Byte(LeftButtonPressed) * MK_LBUTTON +
Byte(GetAsyncKeyState(VK_MBUTTON) < 0) * MK_MBUTTON +
Byte(RightButtonPressed) * MK_RBUTTON +
Byte(GetAsyncKeyState(VK_SHIFT) < 0) * MK_SHIFT;
Result.Time := 0;
Result.Pt := PMouseHookStruct(lParam)^.pt;
end;
begin
Result := 0;
try
if Code <> HC_ACTION then
Exit;
if wParam = WM_MBUTTONDOWN then
begin
{smth}
end;
finally
Res := CallNextHookEx(WHook, Code, wParam, lParam);
if Result = 0 then
Result := Res;
end;
end;

procedure RemoveHook;
begin
if GetCapture <> 0 then
SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
UnhookWindowsHookEx(WHook);
end;


 
Ramario ©   (2004-01-14 14:12) [6]

Спасибо щас попробую


 
Piter ©   (2004-01-14 14:33) [7]

Юрий Зотов, а чем SetCapture не надежен?


 
Anton.   (2004-01-14 14:37) [8]

Можно еще вопрос в тему а как определить произошол ли скрол мыши над текущим элементом например grid"ом


 
NAlexey ©   (2004-01-14 14:59) [9]

Опля! Прошу прощения. Я описал вовсе не глобальный хук, это будет работать в пределах родного приложения. Так что извините, невнимательно прочитал вопрос.


 
Юрий Зотов ©   (2004-01-14 17:28) [10]

> Piter © (14.01.04 14:33) [7]

Тем, что ничто не мешает любому другому чужому окну сделать SetCapture на себя (что бывает очень часто) и наша программа окажется "отключенной" (причем еще хорошо, если временно, а вот если чужое окно "забудет" восстановить Capture (что тоже не редкость), то наша программа "отключится" уже навсегда).

> NAlexey © (14.01.04 14:59) [9]

Совершенно верно, это типичный код локального хука. Причем даже если перенести его в DLL и изменить пfраметры SetWindowHookEx, то хук все равно глобальным не станет (из-за переменной WHook).

> Ramario © (14.01.04 14:12) [6]
> Спасибо щас попробую

Можете даже и не пробовать, потому что результат заранее известен. Код работать будет, но только когда активна Ваша программа. Нужен глобальный хук, а с ним все сложнее. Читайте статью Алексея Павлова.


 
Ramario ©   (2004-01-17 19:04) [11]

Похоже придется после сессии занятся прочтением хелпа :(


 
Игорь Шевченко ©   (2004-01-17 22:16) [12]

SetCapture проще.

Для того, чтобы определить момент, что другое приложение вызывало SetCapture, нужно обрабатывать сообщение WM_CAPTURECHANGED.

"Calling SetCapture causes the window that is losing the mouse capture to receive a WM_CAPTURECHANGED message."


 
Игорь Шевченко ©   (2004-01-17 22:20) [13]

Впрочем, все зависит от задачи. В такой постановке непонятно, для чего нужно ловить нажатие средней кнопки мыши :)



Страницы: 1 вся ветка

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

Наверх




Память: 0.49 MB
Время: 0.017 c
14-93627
Avenger[NhT]
2004-01-08 15:19
2004.01.29
Avl - Api Visual Library


4-93744
Sergei
2003-11-22 11:29
2004.01.29
StdIn и StdOut


14-93667
Rouse_
2004-01-07 19:27
2004.01.29
В принципе для футболистов футбол - дело привычное. ;)


3-93373
SnapIn
2004-01-04 10:33
2004.01.29
Помогите с SQL запросом


3-93330
Ренат
2003-12-30 10:00
2004.01.29
AdoQuery parameters