击键队列vba帮助
我正在开发一个例程,该例程一度进入Do循环并通过GetAsyncKeystroAPI对击键输入做出反应。该例程查看箭头键和其他几个键,并将这些击键转换为激活所选动态块的翻转和角度状态——为用户和交互式工具提供块操作。无论如何,我遇到的问题是,当循环完成时,循环中按下的所有击键都会冲进命令行。我非常小心地为例程选择没有与它们关联的命令或快捷方式的键。然而,UP箭头键是踢踏者。我希望将其保留在例程中,因为在使用其他键时很明显。此外,即使我不使用它,我相信用户仍然会在使用其他箭头键时点击它。
我希望能够做到的是,当子完成时,防止所有这些击键返回命令行。
我尝试过在每次击键后使用SetKeyboardState API来尝试掩盖我的踪迹。但是,它什么也不做。我的猜测是,在退出子之前需要清除一些击键队列。有人知道它是否存在吗,如果存在,如何清除它?如果它不存在,我可以关闭一些Acad变量吗?是否有系统变量等......?
我简要地看了一下击键挂钩,但它们看起来非常复杂,我甚至不确定它是否能满足我的要求。
任何帮助???
哦,是的,我知道,我应该停止使用vba。NET......我知道。此外,我对将我的代码转换为lisp没有兴趣。我可以使用lisp来完成一些非常基本的任务。如果需要,我可以使用lisp设置变量,但我不想“全力以赴”。
提前谢谢。
这是代码片段:
Do
U = GetAsyncKeyState(VK_UP)
D = GetAsyncKeyState(VK_DOWN)
L = GetAsyncKeyState(VK_LEFT)
R = GetAsyncKeyState(VK_RIGHT)
A = GetAsyncKeyState(VK_RCONTROL)
'Ret = GetAsyncKeyState(VK_RETURN)
'Space = GetAsyncKeyState(VK_SPACE)
S = GetAsyncKeyState(VK_RSHIFT)
If (Rot >= 0 And Rot = 135 And Rot = 315 Then
If HasH And (U < 0 Or D < 0) Then
Set objDyn = DynProps(h)
If Hflip = 0 Then
objDyn.Value = 1
objRef.Update
objRef.Highlight True
Exit Do
Else
objDyn.Value = 0
objRef.Update
objRef.Highlight True
Exit Do
End If
ElseIf HasV And (R < 0 Or L < 0) Then
Set objDyn = DynProps(v)
If Vflip = 0 Then
objDyn.Value = 1
objRef.Update
objRef.Highlight True
Exit Do
Else
objDyn.Value = 0
objRef.Update
objRef.Highlight True
Exit Do
End If
ElseIf A < 0 And HasRot Then
Set objDyn = DynProps(t)
objDyn.Value = Rad - (¶ / 2)
objRef.Update
objRef.Highlight True
Exit Do
ElseIf S < 0 Then 'Ret < 0 Or Space < 0 Then
Done = True
Exit Do
End If
Else
If HasV And (U < 0 Or D < 0) Then
Set objDyn = DynProps(v)
If Vflip = 0 Then
objDyn.Value = 1
objRef.Update
objRef.Highlight True
Exit Do
Else
objDyn.Value = 0
objRef.Update
objRef.Highlight True
Exit Do
End If
ElseIf HasH And (R < 0 Or L < 0) Then
Set objDyn = DynProps(h)
If Hflip = 0 Then
objDyn.Value = 1
objRef.Update
objRef.Highlight True
Exit Do
Else
objDyn.Value = 0
objRef.Update
objRef.Highlight True
Exit Do
End If
ElseIf A < 0 And HasRot Then
Set objDyn = DynProps(t)
objDyn.Value = Rad - (¶ / 2)
objRef.Update
objRef.Highlight True
Exit Do
ElseIf S < 0 Then 'Ret < 0 Or Space < 0 Then
Done = True
Exit Do
End If
End If
Loop
我可以发布更多代码,但我认为我正在寻找的与我已经拥有的没有太大关系。
**** Hidden Message ***** 尝试使用WinAPI函数“Peakmessage”遍历当前在应用程序消息队列中的消息(按键等),并确保wRemovemsg参数设置为1以清除消息队列。您可以使用当前应用程序对象的句柄,因为这也会捕获所有子调用。
关于
http://msdn . Microsoft . com/en-us/library/windows/desktop/ms 644943(v = vs . 85)。文件 只是一个小问题。
你能做这样的事情吗?:
objDyn.Value = cint(Not cbool(Hflip))
objRef.Update
objRef.Highlight True
Exit Do
而不是:
If Hflip = 0 Then
objDyn.Value = 1
objRef.Update
objRef.Highlight True
Exit Do
Else
objDyn.Value = 0
objRef.Update
objRef.Highlight True
Exit Do
End If
感谢你们两位的回复
我对语言知识的缺乏和对其逻辑的理解说明了这一点,不是吗?谢谢你的提示!我相信我可以从我使用的各个模块中删除几百行代码
我要试试Peakmessage。在此期间,一个快速的问题是如何确定AutoCAD的控制柄<再次感谢这两者!! 我已经并且仍然以同样的方式编码。
一两个月后,我重读了一些代码,觉得应该有更好的方法。
不是说我的更好,这只是一个问题,也取决于HFlip/VFlip只能是0还是1。
我认为AutoCAD应用程序的句柄存储为Application。HWnd之类的。 当我开始更深入地使用vba时,我注意到你需要处理一两个变量,这两个变量是相反的。给定这些动态属性,使用您描述的方法很容易。我的第一直觉是生成一个数学公式来做这件事,然后把它变成一个函数。对于任意两个整数,一定有一种方法,我一直在寻找解决的方法。但是,我想在这一点上,我可以用函数中的if语句来做。 下面是我编写的代码所做的事情:
objDyn.Value = cint(Not cbool(Hflip))
设置objDyn。Value =将真/假转换为整数(与(将整数0/1转换为假/真)相反)。value = Integer
HFlip = Integer
True = 1 = Not False
False = 0 = Not True
其他数字可能更难。
1s和0很容易。 这就是我的想法。我在不同的地方见过cbool,但直到这篇文章才明白它的实际用途。我也没有意识到我可以使用Not来翻转布尔变量——我从未想过在ifs、循环等之外尝试它。不过,有道理。
谢谢
页:
[1]