乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 117|回复: 7

击键队列vba帮助

[复制链接]

6

主题

17

帖子

8

银币

初来乍到

Rank: 1

铜币
34
发表于 2012-1-5 08:53:46 | 显示全部楼层 |阅读模式
我正在开发一个例程,该例程一度进入Do循环并通过GetAsyncKeystroAPI对击键输入做出反应。该例程查看箭头键和其他几个键,并将这些击键转换为激活所选动态块的翻转和角度状态——为用户和交互式工具提供块操作。
无论如何,我遇到的问题是,当循环完成时,循环中按下的所有击键都会冲进命令行。我非常小心地为例程选择没有与它们关联的命令或快捷方式的键。然而,UP箭头键是踢踏者。我希望将其保留在例程中,因为在使用其他键时很明显。此外,即使我不使用它,我相信用户仍然会在使用其他箭头键时点击它。
我希望能够做到的是,当子完成时,防止所有这些击键返回命令行。
我尝试过在每次击键后使用SetKeyboardState API来尝试掩盖我的踪迹。但是,它什么也不做。我的猜测是,在退出子之前需要清除一些击键队列。有人知道它是否存在吗,如果存在,如何清除它?如果它不存在,我可以关闭一些Acad变量吗?是否有系统变量等......?
我简要地看了一下击键挂钩,但它们看起来非常复杂,我甚至不确定它是否能满足我的要求。
任何帮助???
哦,是的,我知道,我应该停止使用vba。NET......我知道。此外,我对将我的代码转换为lisp没有兴趣。我可以使用lisp来完成一些非常基本的任务。如果需要,我可以使用lisp设置变量,但我不想“全力以赴”。
提前谢谢。
这是代码片段:
  1. Do
  2.                
  3.             U = GetAsyncKeyState(VK_UP)
  4.             D = GetAsyncKeyState(VK_DOWN)
  5.             L = GetAsyncKeyState(VK_LEFT)
  6.             R = GetAsyncKeyState(VK_RIGHT)
  7.             A = GetAsyncKeyState(VK_RCONTROL)
  8.             'Ret = GetAsyncKeyState(VK_RETURN)
  9.             'Space = GetAsyncKeyState(VK_SPACE)
  10.             S = GetAsyncKeyState(VK_RSHIFT)
  11.                
  12.             If (Rot >= 0 And Rot = 135 And Rot = 315 Then
  13.                
  14.                 If HasH And (U < 0 Or D < 0) Then
  15.                     
  16.                     Set objDyn = DynProps(h)
  17.                     
  18.                     If Hflip = 0 Then
  19.                         objDyn.Value = 1
  20.                         objRef.Update
  21.                         objRef.Highlight True
  22.                         Exit Do
  23.                     Else
  24.                         objDyn.Value = 0
  25.                         objRef.Update
  26.                         objRef.Highlight True
  27.                         Exit Do
  28.                     End If
  29.                            
  30.                 ElseIf HasV And (R < 0 Or L < 0) Then
  31.                     
  32.                     Set objDyn = DynProps(v)
  33.                         
  34.                     If Vflip = 0 Then
  35.                         objDyn.Value = 1
  36.                         objRef.Update
  37.                         objRef.Highlight True
  38.                         Exit Do
  39.                     Else
  40.                         objDyn.Value = 0
  41.                         objRef.Update
  42.                         objRef.Highlight True
  43.                         Exit Do
  44.                     End If
  45.                         
  46.                 ElseIf A < 0 And HasRot Then
  47.                     
  48.                     Set objDyn = DynProps(t)
  49.                     objDyn.Value = Rad - (¶ / 2)
  50.                     objRef.Update
  51.                     objRef.Highlight True
  52.                     Exit Do
  53.                         
  54.                 ElseIf S < 0 Then 'Ret < 0 Or Space < 0 Then
  55.                     
  56.                 Done = True
  57.                 Exit Do
  58.                         
  59.                 End If
  60.                     
  61.             Else
  62.                
  63.                 If HasV And (U < 0 Or D < 0) Then
  64.                     
  65.                     Set objDyn = DynProps(v)
  66.                     
  67.                     If Vflip = 0 Then
  68.                         objDyn.Value = 1
  69.                         objRef.Update
  70.                         objRef.Highlight True
  71.                         Exit Do
  72.                     Else
  73.                         objDyn.Value = 0
  74.                         objRef.Update
  75.                         objRef.Highlight True
  76.                         Exit Do
  77.                     End If
  78.                            
  79.                 ElseIf HasH And (R < 0 Or L < 0) Then
  80.                     
  81.                     Set objDyn = DynProps(h)
  82.                         
  83.                     If Hflip = 0 Then
  84.                         objDyn.Value = 1
  85.                         objRef.Update
  86.                         objRef.Highlight True
  87.                         Exit Do
  88.                     Else
  89.                         objDyn.Value = 0
  90.                         objRef.Update
  91.                         objRef.Highlight True
  92.                         Exit Do
  93.                     End If
  94.                         
  95.                 ElseIf A < 0 And HasRot Then
  96.                     
  97.                     Set objDyn = DynProps(t)
  98.                     objDyn.Value = Rad - (¶ / 2)
  99.                     objRef.Update
  100.                     objRef.Highlight True
  101.                     Exit Do
  102.                         
  103.                 ElseIf S < 0 Then 'Ret < 0 Or Space < 0 Then
  104.                     
  105.                     Done = True
  106.                     Exit Do
  107.                         
  108.                 End If
  109.                     
  110.             End If
  111.                
  112.         Loop

我可以发布更多代码,但我认为我正在寻找的与我已经拥有的没有太大关系。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

3

主题

33

帖子

1

银币

初来乍到

Rank: 1

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

使用道具 举报

6

主题

17

帖子

8

银币

初来乍到

Rank: 1

铜币
34
发表于 2012-1-9 17:54:44 | 显示全部楼层
只是一个小问题。
你能做这样的事情吗?:
  1.                         objDyn.Value = cint(Not cbool(Hflip))
  2.                         objRef.Update
  3.                         objRef.Highlight True
  4.                         Exit Do

而不是:
  1.                     If Hflip = 0 Then
  2.                         objDyn.Value = 1
  3.                         objRef.Update
  4.                         objRef.Highlight True
  5.                         Exit Do
  6.                     Else
  7.                         objDyn.Value = 0
  8.                         objRef.Update
  9.                         objRef.Highlight True
  10.                         Exit Do
  11.                     End If

回复

使用道具 举报

3

主题

33

帖子

1

银币

初来乍到

Rank: 1

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

使用道具 举报

6

主题

17

帖子

8

银币

初来乍到

Rank: 1

铜币
34
发表于 2012-1-10 15:11:11 | 显示全部楼层
我已经并且仍然以同样的方式编码。
一两个月后,我重读了一些代码,觉得应该有更好的方法。
不是说我的更好,这只是一个问题,也取决于HFlip/VFlip只能是0还是1。
我认为AutoCAD应用程序的句柄存储为Application。HWnd之类的。
回复

使用道具 举报

3

主题

33

帖子

1

银币

初来乍到

Rank: 1

铜币
45
发表于 2012-1-11 09:46:54 | 显示全部楼层
当我开始更深入地使用vba时,我注意到你需要处理一两个变量,这两个变量是相反的。给定这些动态属性,使用您描述的方法很容易。我的第一直觉是生成一个数学公式来做这件事,然后把它变成一个函数。对于任意两个整数,一定有一种方法,我一直在寻找解决的方法。但是,我想在这一点上,我可以用函数中的if语句来做。
回复

使用道具 举报

6

主题

17

帖子

8

银币

初来乍到

Rank: 1

铜币
34
发表于 2012-1-11 12:40:29 | 显示全部楼层
下面是我编写的代码所做的事情:
  1. objDyn.Value = cint(Not cbool(Hflip))

设置objDyn。Value =将真/假转换为整数(与(将整数0/1转换为假/真)相反)。value = Integer
HFlip = Integer
True = 1 = Not False
False = 0 = Not True
其他数字可能更难。
1s和0很容易。
回复

使用道具 举报

6

主题

17

帖子

8

银币

初来乍到

Rank: 1

铜币
34
发表于 2012-1-11 16:27:59 | 显示全部楼层
这就是我的想法。我在不同的地方见过cbool,但直到这篇文章才明白它的实际用途。我也没有意识到我可以使用Not来翻转布尔变量——我从未想过在ifs、循环等之外尝试它。不过,有道理。
谢谢
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-6-30 10:44 , Processed in 0.692093 second(s), 69 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表