Откриване на натискане на ляв и десен клавиш Ctrl

Можете ли да ми кажете как да открия натиснат ляв или десен клавиш Ctrl?

С най-добри пожелания, Игор Степанов

Опитах се да използвам тази функция, но не ми се получи. Възможно ли е да напиша кода подробно.

Използвам тази функция, за да определя многократно натиснатия клавиш: function GetKeyState1(Key: Integer): Boolean; var Buffer: TKeyboardState; begin GetKeyboardState(Buffer); Резултат := Буфер[Ключ] <> 0; end; function GetRCTRL: Boolean; begin Result := GetKeyState1(VK_RCONTROL); end; function GetLCTRL: Boolean; begin Result := GetKeyState1(VK_LCONTROL); end; Първо дефинирайте натискането на Control pro cedure TGKSF .FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin If key=VK_CONTROL then LRctrlkeys:=True; Ако key=VK_ESCAPE then escpressed:=True; end; След това определям дали е натиснат левият или десният клавиш: LeftCtrl:=False; RightCtrl:=False; LControl:=0; RControl:=0; още веднъж: escpressed:=False; LRctrlkeys:=Невярно; LeftCtrl:=False; RightCtrl:=False; Повторете Application.ProcessMessages; Ако е натиснат, започва GKSF.Close; изход; край; До LRctrlkeys; LeftCtrl:= GetLCTRL; Ако LeftCtrl тогава започнете MessageDlg("Натиснат ляв клавиш Ctrl",mtInformation,[mbOK],0); отивам още веднъж; край; RightCtrl:= GetRCTRL; Ако RightCtrl тогава започнете MessageDlg("Натиснат десен клавиш Ctrl",mtInformation,[mbOK],0); отивам още веднъж; край;

Въпреки това, когато се натисне многократно, той се открива неправилно. Как мога да използвам сканираните кодове, които използвах успешно, когато работех в Pascal под DOS.

По дяволите, добре, все още е просто:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift:TShiftState); започнете ако GetKeyState(VK_RCONTROL)

PS: Не използвайте Goto - не е добре.

Можете ли да ми кажете дали е възможно да получите сканираните кодове за натискане и отпускане на всеки клавиш на клавиатурата с помощта на API функции?

Както желаеш. Уловете WM_KEYDOWN/WM_KEYUP събития

WM_KEYUP nVirtKey = (int) wParam; // код на виртуален ключ lKeyData = lParam; // ключови данни

сканиран_код := (KeyData shr 8) shl 24; RIGHT_KEY_PUSH := KeyData и $01000000 > 0;

PS: Не съм го пробвал сам, защо ми трябва код за сканиране, представям си смътно.

Благодаря, ще опитам. Ще се опитам да обясня защо търся кодове за сканиране.

Трябва да определя дали левият или десният клавиш Ctrl е бил натиснат и веднага пуснат. При психофизиологичния тест субектът трябва в отговор на един сигнал да натисне и отпусне левия Ctrl, а в отговор на друг сигнал - десния Ctrl.

Следователно функцията GetkeyState не е подходяща, тъй като тя определя дали левият или десният клавиш Ctrl е задържан. Трябва да дефинирам и събитието - отпускане на клавиша Ctrl. Това вероятно се прави най-добре със сканиран код за освобождаване на ключ. Как да го кача на Windows? В DOS програмите го направих елементарно.

>Игор Степанов (19.11.05 19:17) [8] >Трябва да дефинирам събитието - отпускам клавиша Ctrl.

Най-накрая се сетих. Form1.KeyPreview = True; След това създайте OnKeyDown и OnKeyUp във формуляра със следния код:

тип TCtrlDown = (myNone, myLeft, myRight);

var CtrlDown: TCtrlDown;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_CONTROL then begin if GetKeyState(VK_RCONTROL)

Уважаеми Дмитрий (gdaujk),

азизпробвах последния ви код и открих, че работи чудесно. Това е най-добрият начин за откриване на кратко натискане и отпускане на клавиши като Shift, Ctrl и Alt. Благодарим ви много за вашата конструктивна помощ. Изключително съм ви благодарен.

Много благодаря на всички, които се включиха в дискусията.

С пожелание за продължаващ успех и с нетърпение очакваме допълнителна помощ,