键盘如何模拟鼠标?(100分)

  • 主题发起人 主题发起人 李宏光
  • 开始时间 开始时间

李宏光

Unregistered / Unconfirmed
GUEST, unregistred user!

请教各位大侠:
一个数据库在一个Dbgrid 中显示, 其中数据库的一个字段 使用popupmenu 菜单
单击鼠标右键来输入,输入时总是动鼠标太麻烦,用键盘的某个键如何模拟
实现点击鼠标右键的功能 ?
 
最简单的是定义各个menubar的热键
稍微复杂点是写一个application.onMessage事件, 判断键盘消息, 如果是特定键
则发送WM_RBUTTONDOWN和WM_RBUTTONUP事件
 
定义一个由右键呼出的菜单,然后再定义一个快捷键
指向这个菜单,就可以了.
 
对不起,Another_eYes,没看见你的回答.
 
可否写键盘处理事件(FORM中)那会比较简单,
 
我觉得如果这个菜单不复杂的话,直接定义每一个菜单项的快捷键,要时一按就行,
连POP都省了。
 
我觉得如果这个菜单不复杂的话,直接定义每一个菜单项的快捷键,要时一按就行,
连POP都省了。
 
在onkeydown event 中调用onmousedown event
 
有没有win95键盘?那上面不是有一个按钮可以激活右键菜单吗?
如果没有win95键盘:
1 PowerToy中有个工具可以自定义按键对应扫描码,从而可以定义一个键为此键;
2 在程序中用KetBD_Event发出此键的虚拟键码。
3 发出鼠标消息
...
 
各位大侠:
能否给出例子,我依然不知如何做?
 
你可以使用
CONST
KEY_MYFUNC01 = 100;
RegistHotKey(Handle, KEY_MYFUNC01, MOD_ALT, VK_F1);
//JUST A SAMPLE
登记系统热键
再通过
procedure WMHotKey(var Msg: TMessage);
message WM_HOTKEY;
截获系统
热键消息
如下:
procedure WMHotKey(var Msg: TMessage);
var
Sender: TObject;
S: TMessage;
begin
case Msg.wParam of
KEY_MYFUNC01: begin
mouse_event(..., ..., ..., ...);
end;
// ......
end;

其中, mouse_event是向Windows发鼠标消息.
我作了一个遥控鼠标的程序, 就是这样作的.
希望可以解决你的问题.
 
其实不必要定义热键的,程序如下:
procedure TForm1.FormKeyDown(Sender: TObject;
var Key: Word;
Shift: TShiftState);//form的处理OnKeyDown的函数
var
point : TPoint;
begin
if ( ( Sender as TDBgrid ) = dbgrid1 )
and ( Key = VK_RETURN ) //VK_***是您的热键的虚键值
then
begin
if GetCursorPos( point ) then
begin
ScreentoClient( point );
popupmenu1.Popup( point.x, point.y );
end;

end;
end;
 
如果不定义系统热键,你必须做Hook,否则,当程序不是
活动的窗口时,键盘消息就得不到!而系统热键法比Hook
简单多了。
 
茶叶蛋先生:
你提的方法很好,但为何此句不灵
if ( ( Sender as TDBgrid ) = dbgrid1 )
 
to :Jimchael Tsee
>如果不定义系统热键,你必须做Hook,否则,当程序不是
>活动的窗口时,键盘消息就得不到!而系统热键法比Hook
>简单多了。
其实李宏光老兄是做数据库的,并不是在windows底层摸爬滚打,
要求当前窗口活动应该是基本要求吧?
to :李宏光
这个程序昨天我试过再贴上来的,贴过就删掉了,我现在再试试看.
 
Shift+F10键
 
茶叶蛋先生:
不知试验的如何了,
huizhang先生:
shift+ F10 我试验的不行
 
如果你用的是Delphi 4.0, 可以用一个THotKey,在它的事件中用
SetCursorPos设置鼠标坐标,

mouse_event函数设置鼠标消息.
还有一个简单的方法: 键值 MOD_APP是Windows 95键盘的右边的
功能键, 相当与用鼠标在当前焦点单击鼠标右键. 你可以用
kbd_event函数发出这个键的消息.
 
感谢各位的帮助,
茶叶蛋先生的答案基本就是我要的
这样就可以了
procedure TForm5.DBGrid1KeyDown(Sender: TObject;
var Key: Word;
Shift: TShiftState);
>var
> point : TPoint;
>begin
> if ( ( Sender as TDBgrid ) = dbgrid1 )
> and ( Key = VK_RETURN ) //VK_***是您的热键的虚键值
> then
> begin
> if GetCursorPos( point ) then
> begin
> ScreentoClient( point );
> popupmenu1.Popup( point.x, point.y );
> end;

> end;
>end;
 
后退
顶部