如何判断当前鼠标的状态??比如:按下、松开、移动等(50分)

  • 主题发起人 主题发起人 san_fish
  • 开始时间 开始时间
S

san_fish

Unregistered / Unconfirmed
GUEST, unregistred user!
rt

先thx咯
 
mouse.xxx
Delphi4以上支持,好象
 
没见有松开、按下的属性啵
 
mousedown
mouseup
 
to Expert:
你说的这是事件吧
 
Win32 API
******************************************
【声明】
Function GetAsyncKeyState Lib "user32" Alias "GetAsyncKeyState" (ByVal vKey As Long) As Integer

【说明】
判断函数调用时指定虚拟键的状态

【返回值】
Long,自对GetAsyncKeyState函数的上一次调用以来,如键已被按过,则位0设为1;否则设为0。如键目前处于按下状态,则位15设为1;如抬起,则为0。微软的win32手册指出:倘若输入焦点从属于与调用函数的输入线程不同的另一个输入线程,则返回值为0(例如,一旦另一个程序拥有焦点,则它应返回零)。证据显示,函数实际是在整个系统的范围内工作的

【备注】
如指定了VK_LBUTTON 或 VK_RBUTTON,按钮的状态就会根据实际的按钮报告——无论是否曾用SwapMouseButton函数对鼠标的位置进行了交换。win32提供了额外的一些虚拟键码,比如VK_LSHIFT
和 VK_RSHIFT,以便在两个完全一样的键中区分出左右(也包括Ctrl 和
Alt)

【参数】
vKey ----------- Long,欲测试的虚拟键的键码
 
鼠标按下:onmousedown 事件
鼠标移动:onmousemove 事件
鼠标松开:onmouseup 事件
[:D]
 
to desertsmoke:
能否对这个函数的参数再说明一下
在delphi的编辑器中的参数提示是:vKey:integer
那么这个参数如何与鼠标通讯呢??
 
如指定了VK_LBUTTON 或 VK_RBUTTON,按钮的状态就会根据实际的按钮报告——
无论是否曾用SwapMouseButton函数对鼠标的位置进行了交换。win32提供了额外
的一些虚拟键码,比如VK_LSHIFT和 VK_RSHIFT,以便在两个完全一样的键中区分
出左右(也包括Ctrl 和Alt),是指下面的键码:
***********************************************
Virtual Key Code Corresponding key

Key_Escape Escape key
Key_Tab Tab key
Key_Backtab, Key_BackTab Backtab key
Key_Backspace, Key_BackSpace Backspace key
Key_Return Return key
Key_Enter Enter key
Key_Insert Insert key
Key_Delete Delete key
Key_Pause Pause key
Key_Print Print key
Key_SysReq SysReq key
Key_Home Home key
Key_End End key
Key_Left Left key
Key_Up Up key

Key_Right Right key
Key_Down Down key
Key_Prior Prior key
Key_PageUp Page up key
Key_Next Next key
Key_PageDown Page down key
Key_Shift Shift key
Key_Control CTRL key
Key_Meta Meta key (often this is the same as the Alt key)
Key_Alt Alt key
Key_CapsLock Caps Lock key
Key_NumLock Num Lock key
Key_ScrollLock Scroll Lock key
Key_F1 F1 key
Key_F2 F2 key
Key_F3 F3 key
Key_F4 F4 key

Key_F5 F5 key
Key_F6 F6 key
Key_F7 F7 key
Key_F8 F8 key
Key_F9 F9 key
Key_F10 F10 key
Key_F11 F11 key
Key_F12 F12 key
Key_F13 F13 key
Key_F14 F14 key
Key_F15 F1 key
Key_F16 F16 key
Key_F17 F17 key
Key_F18 F18 key
Key_F19 F19 key
Key_F20 F20 key
Key_F21 F21 key
Key_F22 F22 key
Key_F23 F23 key
Key_F24 F24 key
Key_F25 F25 key
Key_F26 F26 key
Key_F27 F27 key
Key_F28 F28 key
Key_F29 F29 key
Key_F30 F30 key
Key_F31 F31 key
Key_F32 F32 key

Key_F33 F33 key
Key_F34 F34 key
Key_F35 F35 key
Key_Super_L Super_L key
Key_Super_R Super_R key
Key_Menu Menu key
Key_Hyper_L Hyper_L key
Key_Hyper_R Hyper_R key
Key_Help Help key
Key_Space, Key_Any Space key

 
万分感激!

但能否对我前面那个问题进行解释呢??
 
ps:上面的那些KEY哪些是关于鼠标的??

我发现好像全是键盘的
 
mbLeft, mbRight, mbMiddle,呵呵~~
 
我说明白一点吧:
假设有个按钮,当按钮按下时一个Memo就上/下滚,当鼠标松开时就停止,做像QQ那样的

应该怎么作??
thx
 
Delphi不是有三个事件吗,
按下,移动,放开,
当然我想用api函数也能解决这个问题
 
re

我是这样做的:
当按下的时候就执行一个循环,让Memo上/下滚
但此时我得去获取鼠标信息(松开)来结束这个循环
我就不知道该怎么做了??

指教
 
to san_fish:
不知道你是在哪个地方按下。
但你是否知道你按下并一直按下的时候,delphi会调用
相应的事件过程(调用一次),比如onmousedown,不管在该过程执行
中,发生了什么事情,都不会立即得到响应,而要直到过程执行完成,这是因为
你一直按下也好,按下马上弹起也好,只触发一次事件过程。然后执行过程代码。
在window OS中,每个动作都被定义成消息,在单线程应用中,只有处理完成了,
才能响应另一个消息。
鼠标的up其实是一个消息(在delphi中是一个事件),弹起的时候,window立即发
该消息到消息队列,直到前面一个消息(mousedown)处理完成。消息才会发给
应用程序。然后由消息(事件)触发相应的事件过程。

如果只是用这几个事件,是无法处理中断滚动的。因为这些事件无法在运行时,
不断扫描外部的输入(动作)。

尽管如此,并不是没有办法,我想了一个方法,你去试试。
就是在你的memo上下滚动的代码中,用getmessage()函数,判断搜索消息队列是有否
鼠标弹起的消息,有的话,立刻终止滚动。
 
getmessage()怎么用啊??
看了半天帮助文档看不懂:(
 
to san_fish:
看看这段代码吧。

procedure TForm1.Button3MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
i,j :integer;
begin
j:=0;
for i:=0 to 1000 do begin
beep();
inc(j);
sleep(200);
GetMessage(msg,0,0,0);
if msg.message =WM_LBUTTONUP then begin
showmessage('跳出来'+IntTostr(j));
Zeromemory(@msg,sizeof(msg));
break;
end;
end;
end;
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部