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

Вниз

Как отследить двойное нажатие клавиши Shift   Найти похожие ветки 

 
leonidus ©   (2005-06-27 08:26) [0]

Мастера подскажите плиз, мне нужно отследить двойное нажатие клавищи Shift в любом приложении. Причем тут должно быть именно двойное нажатие а не просто долговременное удержание.

Я делаю так, по таймеру:

if HiWord(GetKeyState(VK_SHIFT)) <> 0  then
 begin
  Timer_Profile_Detector.Tag:=Timer_Profile_Detector.Tag+1;
  if Timer_Profile_Detector.tag=2 then
   begin
    DoSomething;
   end;
 end
  else Timer_Profile_Detector.Tag:=0;

Смысл тут в том, что если два тика подрят программа засекла нажатый Shift значит типа двойное нажатие. На самом деле это не так, достаточно просто подержать Shift что бы запустилась процедура DoSomething, а как перехватить именно Shift+Shift ?


 
default ©   (2005-06-27 09:21) [1]

что значит Shift+Shift?
если это нажатие левого и правого шифта, то к сожалению не NT винда не реагирует на VK_LSHIFT, VK_RSHIFT константы в GetKeyState
если нужно просто отследить последовательное нажатие двух любых шифтов, то см. хелп по GetKeyState, из неё можно узнавать нажата или отпущена клавиша


 
default ©   (2005-06-27 09:22) [2]

GetKeyState имеет результатом значение типа SmallInt-это два байта
о каком HiWord может быть речь


 
leonidus ©   (2005-06-27 13:02) [3]

Речь идет именно о двух подряд нажатых Shift`ах не важно левых или правых.


 
default ©   (2005-06-27 13:06) [4]

leonidus ©   (27.06.05 13:02) [3]
"если нужно просто отследить последовательное нажатие двух любых шифтов, то см. хелп по GetKeyState, из неё можно узнавать нажата или отпущена клавиша"
неужели сам не сообразишь...


 
Digitman ©   (2005-06-27 13:10) [5]

OnKeyDown + OnKeyUp + таймер


 
default ©   (2005-06-27 13:43) [6]


procedure TForm1.Timer1Timer(Sender: TObject);
begin
if GetKeyState(VK_SHIFT) and $8000 <> 0 then begin
  if Timer1.Tag mod 2 = 0 then Timer1.Tag := Timer1.Tag + 1;
end else begin
  if Timer1.Tag mod 2 <> 0 then Timer1.Tag := Timer1.Tag + 1;
  if Timer1.Tag = 4 then begin
    Caption := IntToStr(Random(1000));
    Timer1.Tag := 0
  end;
end;
end;

вот с использованием одной переменной...


 
alpet ©   (2005-06-27 14:02) [7]

Более сложный код. Проверяется, что не нажимались другие клавиши, и что Shift нажимается монопольно (т.е. без других клавиш).

function  PressedKey (var key: Byte; var shift: boolean): Boolean;
var ks: TKeyboardState;
   n: dword;

begin
result := false;
GetKeyboardState (ks);
shift := false;
for n := 8 to 255 do
 if (ks [n] and $80 <> 0) then
  begin
   key := n;
   result := true;
   shift := (n = VK_SHIFT) or
            (n = VK_LSHIFT) or
            (n = VK_RSHIFT);
   if not shift then exit; // other key detected!            
  end
end; // PressedKey

procedure TForm1.Timer1Timer(Sender: TObject);
var p, s: Boolean;
   k: Byte;
begin
{ Timer.Interval = 10 default
  Flag declared in TForm1.private as Boolean
  nShift declared in TForm1.private as Dword
  timeOut declared on TForm1.private as Dword
 }
p := PressedKey (k, s); // retrieve press key
if not p and flag then
  begin
   inc (nShift, 1);    // one shift pressed
   timeOut := 50; // startup delay
  end;
flag := s;
if p xor s then nShift := 0; // some other key pressed
if timeOut <> 0 then
 begin
  dec (timeOut);
  if timeOut = 0 then nShift := 0;
 end;
if (nShift > 1) then
 begin
  nShift := 0;
  ShowMessage ("Two shift pressed!");
 end;
end;


 
default ©   (2005-06-27 14:03) [8]


procedure TForm1.Timer1Timer(Sender: TObject);
begin
 if GetKeyState(VK_SHIFT) and $8000 <> 0 then begin
   if Timer1.Tag mod 2 = 0 then Timer1.Tag := Timer1.Tag + 1;
 end else begin
   if Timer1.Tag mod 2 <> 0 then begin
     Timer1.Tag := Timer1.Tag + 1;
     if Timer1.Tag = 4 then begin
       Caption := IntToStr(Random(1000));
       Timer1.Tag := 0
     end;
   end;
 end;
end;

P.S. чуть лучше


 
default ©   (2005-06-27 14:39) [9]


procedure TForm1.Timer1Timer(Sender: TObject);
begin
 if GetAsyncKeyState(VK_SHIFT) and $8000 <> 0 then begin
   if not Odd(Timer1.Tag) then Timer1.Tag := Timer1.Tag + 1;
 end else begin
   if Odd(Timer1.Tag) then begin
     Timer1.Tag := Timer1.Tag + 1;
     if Timer1.Tag = 4 then begin
       Caption := IntToStr(Random(1000));
       Timer1.Tag := 0
     end;
   end;
 end;
end;

нужно GetAsyncKeyState для "отследить двойное нажатие клавищи Shift в любом приложении"


 
alpet ©   (2005-06-27 14:43) [10]

Дык вот - для любого приложения (возможности теже):

function  PressedKey (var shift: boolean): Boolean;
var n: dword;
begin
result := false;
shift := false;
for n := 8 to 255 do
 if (GetAsyncKeyState (n) and $F000 <> 0) then
  begin
   // key := n;
   result := true;
   shift := (n = VK_SHIFT) or
            (n = VK_LSHIFT) or
            (n = VK_RSHIFT);
   if not shift then exit; // other key detected!
  end
end; // PressedKey

procedure TForm1.Timer1Timer(Sender: TObject);
var p, s: Boolean;
   k: Byte;
begin
{ Timer.Interval = 10 default
  Flag declared in TForm1.private as Boolean
  nShift declared in TForm1.private as Dword
  timeOut declared on TForm1.private as Dword
 }
p := PressedKey (s); // retrieve press key
if not p and flag then
  begin
   inc (nShift, 1);    // one shift pressed
   timeOut := 50; // startup delay
  end;
flag := s;
if p xor s then nShift := 0; // some other key pressed
if timeOut <> 0 then
 begin
  dec (timeOut);
  if timeOut = 0 then nShift := 0;
 end;
if (nShift > 1) then
 begin
  nShift := 0;
  ShowMessage ("Two shift pressed!");
 end;
end;



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

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

Наверх




Память: 0.5 MB
Время: 0.041 c
14-1122362835
VID
2005-07-26 11:27
2005.08.21
Привет


1-1122932043
Ке
2005-08-02 01:34
2005.08.21
Почему в хинте нельзя отобразить "|" ?


14-1122613410
Rentgen
2005-07-29 09:03
2005.08.21
АвтоПереименование в IDE Delphi


1-1122734828
Peter3
2005-07-30 18:47
2005.08.21
Как получить данные, имея только указатель на них?


14-1122532825
Ломброзо
2005-07-28 10:40
2005.08.21
Пологожинкивнык, бэзкысенци...