Форум: "Основная";
Текущий архив: 2004.01.29;
Скачать: [xml.tar.bz2];
ВнизСредняя кнопка мыши Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c