Главная страница
    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.007 c
1-93522
А. Владимир
2004-01-18 13:56
2004.01.29
LoadLibrary


14-93674
BlackTiger
2003-12-30 13:43
2004.01.29
Delphi8. Что-то я не понял прикола...


1-93570
Drakon
2004-01-16 23:18
2004.01.29
Стиль Windows XP в Delphi 8 for .Net


3-93359
_T1000_
2003-12-31 12:26
2004.01.29
Could not find object


11-93409
KilkennyCat
2003-05-11 00:44
2004.01.29
ТreeView





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский