Форум: "WinAPI";
Текущий архив: 2003.01.13;
Скачать: [xml.tar.bz2];
ВнизGetAsyncKeyState(VK_LBUTTON) Найти похожие ветки
← →
Алёшка1900 (2002-11-25 22:01) [0]Здравствуйте!
Я использую эту функцию в Timer"е с интевалом в 100 мс. То есть каждые 100 мс у меня проверяется:
if Bool(GetAsyncKeyState(VK_LBUTTON)) then
Так вот, если подержать кнопку мышки нажатой немного, то событие OnTimer повторится много раз. А можно проверить, отпустил ли пользователь кнопку мыши, или нет?
← →
Cobalt (2002-11-25 23:44) [1]Не думаю, что GetAsyncKeyState вообще поможет в таком деле. Посмотрите мой примерчик (Label1 отображает текущее состояние кнопки, а Listbox1 ведет журнал нажатий/отпусканий)
const LB_Down:boolean = false;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if LB_Down
then begin LB_Down:=Bool(GetAsyncKeyState(VK_LBUTTON));
if LB_Down
then Label1.Caption:="LB_Down"
else Label1.Caption:="LB_Up";
if not LB_Down
then ListBox1.Items.Add(TimeToStr(Time)+" LB_Up")
end
else begin LB_Down:=Bool(GetAsyncKeyState(VK_LBUTTON));
if LB_Down
then ListBox1.Items.Add(TimeToStr(Time)+" LB_Down")
end;
if LB_Down
then Label1.Caption:="LB_Down"
else Label1.Caption:="LB_Up";
end;
Честно говоря, я ОЧЕНЬ удивился, но, посмотрев справку по ф-ии GetAsyncKeyState удивился еще больше:
If the most significant bit is set, the key is down, and if the least significant bit is set, the key was pressed after the previous call to GetAsyncKeyState. The return value is zero if a window in another thread or process currently has the keyboard focus.
К сожалению, смысл этих (выделенных) слов ускользает от меня...
Функция GetKeyState ведет себя не менее странным образом в этом отношении.
P.S. Все это тестировалось в ВинХР, так что сообщите отом, как это прошло в Вин98.
← →
icWasya (2002-11-26 16:38) [2]
procedure TForm1.Timer1Timer(Sender: TObject);
var W:Word;
S:String;
begin
W:=GetAsyncKeyState(VK_LBUTTON);
if W = $8001 then S := "кнопка отпущена" else
if W = $0001 then S := "кнопка нажата" else
if W = $8000 then S := "кнопка давно нажата" else
if W = $0000 then S := "кнопка давно отпущена" else
S := "учи матчасть";
Label1.Caption:=Format("%s %.4x",[S , W] );
end;
← →
Алёшка1900 (2002-11-26 19:56) [3]Cobalt - спасибо, конечно, но этот вариант не пригоден по крайней мере для вин98, так как он делает тоже, что и
if Bool(GetAsyncKeyState(VK_LBUTTON)) then
Даже если я нажал кнопку и не отпустил, то всё равно пишет, что отпустил. А вот icWasya - спасибо, прикольно! А где ты про эти значения вычитал?
← →
Cobalt (2002-11-26 23:29) [4]>icWasya © (26.11.02 16:38)
Что значит - опыт!
Поправочка:
if W = $8001 then S := "кнопка нажата" else
if W = $8000 then S := "кнопка давно нажата" else
if W = $0000 then S := "кнопка отпущена" else
S := "учи матчасть";
А комбинации "кнопка давно отпущена" - видать не существует. ;(
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.01.13;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.009 c