Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.46 MB
Время: 0.009 c
14-37291
ZORRO
2002-12-20 09:51
2003.01.13
Сайт


3-36978
atmamont
2002-12-18 23:33
2003.01.13
помогите разобраться с реляционной структурой


14-37384
Шишкин Егор
2002-12-24 17:45
2003.01.13
Последный герой 2


4-37427
Landgraph
2002-11-23 12:26
2003.01.13
App Timers


1-37015
dim-
2002-12-31 13:48
2003.01.13
Как работать с OLE Compound Storage





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