PowerPoint(或Excel)VBA捕获鼠标点击坐标

时间:2015-06-25 16:01:16

标签: vba excel-vba powerpoint-vba cad powerpoint-2010

一些背景:

快速的背景是我正处于构建PowerPoint加载项的研究阶段。我的最终目标是开发CAD尺寸标注插件,以帮助加快工程演示文稿的创建。我们必须做很多" PowerPoint工程"其中组件的一般尺寸显示在使用PPT形状或CAD几何图形本身的屏幕截图创建的所述组件的简化版本上。但是反复创建维度是单调乏味的。每个通常由箭头,2行和具有维度值的文本框组成。

这是我需要帮助的地方。

(如果您知道如何在Excel中执行以下操作,那也可以使用,我将在稍后确定PPT等效值。)

在PowerPoint幻灯片中,在设计模式下(即不是幻灯片放映模式),我想执行以下工作流程:

  1. 在打开的UserForm中,用户单击名为" START"
  2. 的按钮
  3. 代码开始在幻灯片本身的区域中侦听鼠标左键单击(LMC)(它不应该响应实际UserForm上的LMC,例如,如果用户需要将UserForm拖出方式)
  4. 在LMC时,光标的坐标记录为(x1,y1)
  5. 重复步骤2& 3记录(x2,y2)
  6. 使用这些坐标做事(例如在两个坐标之间绘制尺寸
  7. 我相信我可以使用例外步骤2来处理所有编码,这就是我在这里的原因。我找到一个起点很困难。具体来说,我需要有关如何收听LMC 的帮助。用语言来说,设想如下:

    While Listening:
      If LMC = TRUE
        Do Stuff
      End If
    End While 
    

    但我不具备编码While Listening部分的知识。我需要在正确的方向上轻推。

    我的搜索已经让我登陆MSDN的MouseDown事件处理程序页面,但在我的测试中,我认为这不是我需要的。好像MouseDown似乎是为了在用户自己的用户窗口中将鼠标停在CommandButton上时启动例程。

    我也找到了这个SO帖子,其中唯一的答案似乎暗示这是不可能的,如果不长篇大论并且代码可能对文件本身有害:How to record mouse clicks in Excel VBA?。 (我没有任何问题需要付出很大的努力并且投入工作,但是如果结果代码很可能造成损害,就像帖子似乎暗示的那样。)(另外,OP没有任何解释,也没有人可以告诉我为什么所以我不会犯同样的错误。)

1 个答案:

答案 0 :(得分:1)

您可以通过执行以下操作来完成您要执行的操作(底部可能对您最有帮助): 首先,声明以下内容:

Public Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Public Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Public Const MOUSEEVENTF_LEFTDOWN = &H2
Public Const MOUSEEVENTF_LEFTUP = &H4
Public Const MOUSEEVENTF_RIGHTDOWN As Long = &H8
Public Const MOUSEEVENTF_RIGHTUP As Long = &H10

以下代码段将允许您单击,双击或右键单击:

Private Sub SingleClick()
  SetCursorPos 100, 100 'x and y position
  mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
End Sub

Private Sub DoubleClick()
  'Double click as a quick series of two clicks
  SetCursorPos 100, 100 'x and y position
  mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
End Sub

Private Sub RightClick()
  Right Click
  SetCursorPos 200, 200 'x and y position
  mouse_event MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0
End Sub

您需要做的就是将光标位置更改为屏幕上的坐标。 为此,我使用以下代码创建了一个新宏,并将其分配给" Ctrl + Y"按钮。这将告诉您当前鼠标位置的坐标。

Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Type POINTAPI
    x As Long
    y As Long
End Type

Sub CurosrXY_Pixels()

    Dim lngStatus As Long
    Dim typWhere As POINTAPI

    lngStatus = GetCursorPos(typWhere)
    MsgBox "x: " & typWhere.x & Chr(13) & "y: " & typWhere.y, vbInformation, "Pixels"

End Sub
相关问题