Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.01 c
3-93336
Egorka
2003-12-29 06:06
2004.01.29
- проблема с импортированием


4-93729
Санёк
2003-11-19 16:50
2004.01.29
Перехват на функцию CreateDC


7-93725
Shaman%20O%20Mega
2003-11-13 14:48
2004.01.29
Загрузка процессора


1-93501
Hex0DesiMaL
2004-01-19 08:59
2004.01.29
Скрыть прогу в панли задач


3-93372
ДЕД
2003-12-31 15:08
2004.01.29
ошибка при обновлении





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский