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

Вниз

как определить какая из клавиш мышки нажата над TMenuItem?   Найти похожие ветки 

 
BillyJeans ©   (2004-05-10 12:04) [0]

Как определить какая из клавиш мышки нажата над TMenuItem в PopupMenu, правая или левая?


 
Palladin ©   (2004-05-10 12:07) [1]

GetKeyState

---
Помните! Чем выше качество вопроса, тем выше качество ответа.


 
BillyJeans ©   (2004-05-10 15:05) [2]

GetAsyncKeyState!!!


 
BillyJeans ©   (2004-05-10 15:37) [3]

блин, а ведь не работает в обработчике onClick TMenuItem"а...
может у кого была подобная ситуация?


 
KilkennyCat ©   (2004-05-10 16:14) [4]

приведите Ваш код. GetKeyState, равно как и GetAsyncKeyState, нормально работает...


 
BillyJeans ©   (2004-05-10 17:24) [5]

они оба работают, но в рамках формы.
вот нерабочий код, который всегда выводит 1 в заголовке :(
procedure TForm1.menu11Click(Sender: TObject);
begin
 Caption := IntToStr(GetAsyncKeyState(VK_RBUTTON));
end;


 
KilkennyCat ©   (2004-05-10 17:55) [6]

Насчет рамок - неверно.
Ваш код не работает по одной простой причине - вызов происходит по клику. А кликом считается отпускание клавиши мыши!


 
BillyJeans ©   (2004-05-10 18:20) [7]

мне мужно определить клик был правой или левой клавишей... какие будут предложения?


 
BillyJeans ©   (2004-05-11 08:46) [8]

??


 
Mim1 ©   (2004-05-11 09:07) [9]

А зачем, вы пишите какой то сверхновый, сверхзаморочный интерфейс?
Про юзабилити читали? Я обчно как и всякий рядовой пользователь шелкаю левой кнопкой мышки.


 
BillyJeans ©   (2004-05-11 09:10) [10]

2 Mim1 ©   (11.05.04 09:07) [9]
очень смешно...


 
Mim1 ©   (2004-05-11 09:16) [11]

[10] BillyJeans ©   (11.05.04 09:10)

А я серьезно, обычно в windows тяжело решать задачи для которых она не предназначена. Вот например посмотрите раздел winapi со всякими запиралками и т.п.


 
BillyJeans ©   (2004-05-11 09:23) [12]

2 Mim1 ©   (11.05.04 09:16) [11]
если желание поболтать, то в "потрепаться"...


 
KilkennyCat ©   (2004-05-11 11:32) [13]

Да нет проблем. Хотите правой щелкать, переключите свапом.


 
BillyJeans ©   (2004-05-11 12:14) [14]

отошли немного от темы...
Вроде бы простой вопрос, какую клавишу на мышке нажал пользователь, выбирая пункт PopupMenu, правую или левую???


 
BillyJeans ©   (2004-05-11 15:11) [15]

???


 
KilkennyCat ©   (2004-05-11 16:03) [16]

GetAsyncKeyState все таки использовать можно.
В таймере если сделать опрос.
Хоть не красиво, но будет работать.
Таймер включайте в onPopup.


 
NAlexey ©   (2004-05-11 17:01) [17]

Ну если ты такой настырный:

var
 OldMHook: HHook = 0;
 FShiftState: TShiftState;

function MouseHook(Code: Integer; wParam: Word; lParam: LongInt ): LongInt;  stdcall;

 function GetShiftState: TShiftState;
 begin
   Result := [];
   if GetAsyncKeyState(VK_SHIFT) < 0 then
     Include(Result, ssShift);
   if GetAsyncKeyState(VK_CONTROL) < 0 then
     Include(Result, ssCtrl);
   if GetAsyncKeyState(VK_MENU) < 0 then
     Include(Result, ssAlt);
   if GetAsyncKeyState(VK_LBUTTON) < 0 then
     Include(Result, ssLeft);
   if GetAsyncKeyState(VK_MBUTTON) < 0 then
     Include(Result, ssMiddle);
   if GetAsyncKeyState(VK_RBUTTON) < 0 then
     Include(Result, ssRight);
 end;

begin
 if Code = HC_ACTION then
 begin
   case Wparam of
     WM_LBUTTONDOWN, WM_RBUTTONDOWN, WM_MBUTTONDOWN:
       FShiftState := GetShiftState;
    end;
 end;
 Result := CallNextHookEx(OldMHook, Code, wParam, lParam )
end;

procedure UnRegisterMouseHook;
begin
 if OldMHook <> 0 then
 begin
   UnHookWindowshookEx(OldMHook);
   OldMHook := 0;
 end;
end;

procedure RegisterMouseHook;
begin
 OldMHook := SetWindowsHookEx(WH_MOUSE, @MouseHook, 0, GetCurrentThreadID);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 RegisterMouseHook;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 UnRegisterMouseHook;
end;

procedure TForm1.N1Click(Sender: TObject);
begin
 if ssLeft in FShiftState then
   Caption := "Left"
 else
   Caption := "";
end;


 
NAlexey ©   (2004-05-11 17:02) [18]

Ну если ты такой настырный:

var
 OldMHook: HHook = 0;
 FShiftState: TShiftState;

function MouseHook(Code: Integer; wParam: Word; lParam: LongInt ): LongInt;  stdcall;

 function GetShiftState: TShiftState;
 begin
   Result := [];
   if GetAsyncKeyState(VK_SHIFT) < 0 then
     Include(Result, ssShift);
   if GetAsyncKeyState(VK_CONTROL) < 0 then
     Include(Result, ssCtrl);
   if GetAsyncKeyState(VK_MENU) < 0 then
     Include(Result, ssAlt);
   if GetAsyncKeyState(VK_LBUTTON) < 0 then
     Include(Result, ssLeft);
   if GetAsyncKeyState(VK_MBUTTON) < 0 then
     Include(Result, ssMiddle);
   if GetAsyncKeyState(VK_RBUTTON) < 0 then
     Include(Result, ssRight);
 end;

begin
 if Code = HC_ACTION then
 begin
   case Wparam of
     WM_LBUTTONDOWN, WM_RBUTTONDOWN, WM_MBUTTONDOWN:
       FShiftState := GetShiftState;
    end;
 end;
 Result := CallNextHookEx(OldMHook, Code, wParam, lParam )
end;

procedure UnRegisterMouseHook;
begin
 if OldMHook <> 0 then
 begin
   UnHookWindowshookEx(OldMHook);
   OldMHook := 0;
 end;
end;

procedure RegisterMouseHook;
begin
 OldMHook := SetWindowsHookEx(WH_MOUSE, @MouseHook, 0, GetCurrentThreadID);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 RegisterMouseHook;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 UnRegisterMouseHook;
end;

procedure TForm1.N1Click(Sender: TObject);
begin
 if ssLeft in FShiftState then
   Caption := "Left"
 else
   Caption := "";
end;


 
BillyJeans ©   (2004-05-11 17:23) [19]

а ведь работает! ;) спасибо...



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

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

Наверх




Память: 0.51 MB
Время: 0.025 c
1-1084030723
Крутыш
2004-05-08 19:38
2004.05.23
Как очистить буфер


1-1083933584
Nikolai_S
2004-05-07 16:39
2004.05.23
Как в TStringGrid отловить событие на двойной щелчок по заголовку


3-1082991554
Frozzen
2004-04-26 18:59
2004.05.23
Как запрос написать


1-1083838438
killer
2004-05-06 14:13
2004.05.23
Раскраска StringGrid-а


1-1083847521
Алексей Петухов
2004-05-06 16:45
2004.05.23
Своя панель как Compotent Palette из Delphi