meyerforhire 发表于 2012-1-5 08:53:46

击键队列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 *****

ChuckHardin 发表于 2012-1-6 18:57:52

尝试使用WinAPI函数“Peakmessage”遍历当前在应用程序消息队列中的消息(按键等),并确保wRemovemsg参数设置为1以清除消息队列。您可以使用当前应用程序对象的句柄,因为这也会捕获所有子调用。
关于
http://msdn . Microsoft . com/en-us/library/windows/desktop/ms 644943(v = vs . 85)。文件

meyerforhire 发表于 2012-1-9 17:54:44

只是一个小问题。
你能做这样的事情吗?:
                        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

ChuckHardin 发表于 2012-1-10 14:54:47

感谢你们两位的回复
我对语言知识的缺乏和对其逻辑的理解说明了这一点,不是吗?谢谢你的提示!我相信我可以从我使用的各个模块中删除几百行代码
我要试试Peakmessage。在此期间,一个快速的问题是如何确定AutoCAD的控制柄<再次感谢这两者!!

meyerforhire 发表于 2012-1-10 15:11:11

我已经并且仍然以同样的方式编码。
一两个月后,我重读了一些代码,觉得应该有更好的方法。
不是说我的更好,这只是一个问题,也取决于HFlip/VFlip只能是0还是1。
我认为AutoCAD应用程序的句柄存储为Application。HWnd之类的。

ChuckHardin 发表于 2012-1-11 09:46:54

当我开始更深入地使用vba时,我注意到你需要处理一两个变量,这两个变量是相反的。给定这些动态属性,使用您描述的方法很容易。我的第一直觉是生成一个数学公式来做这件事,然后把它变成一个函数。对于任意两个整数,一定有一种方法,我一直在寻找解决的方法。但是,我想在这一点上,我可以用函数中的if语句来做。

meyerforhire 发表于 2012-1-11 12:40:29

下面是我编写的代码所做的事情:
objDyn.Value = cint(Not cbool(Hflip))
设置objDyn。Value =将真/假转换为整数(与(将整数0/1转换为假/真)相反)。value = Integer
HFlip = Integer
True = 1 = Not False
False = 0 = Not True
其他数字可能更难。
1s和0很容易。

meyerforhire 发表于 2012-1-11 16:27:59

这就是我的想法。我在不同的地方见过cbool,但直到这篇文章才明白它的实际用途。我也没有意识到我可以使用Not来翻转布尔变量——我从未想过在ifs、循环等之外尝试它。不过,有道理。
谢谢
页: [1]
查看完整版本: 击键队列vba帮助