最近公司用VBA做了一个自动化项目,其中有一个功能是,每天按动Useform 上一个子控件-按钮,然后进行数据转换,具体什么数据就没关系了。这个按按钮的动作一般是在晚上自动操作的,因此在计划任务中定时完成。开始的时候做法是 用sendkeys  键,发送enter,可以实现按钮自动按下。但是这种方法有个问题,就是公司电脑在人走后,会自动锁屏(强制),锁屏后,这种方法就完全失效了。  
      我思考了一下,觉得只有用sendmessage或Postmessage这样子,才能实现。但是使用这俩函数如何尝试都没效果,求大神帮忙,下面是代码。
     Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
     Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
    Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
sub test()
    i = FindWindow(vbNullString, UserForm1.Caption)
   j = FindWindowEx(i, 0, vbNullString, myButton1)
k= PostMessage(j, WM_LBUTTONUP, 0&, 0&)
m = PostMessage(j, WM_LBUTTONUP, 0&, 0&)
end sub
加sleep没什么效果的,试过。,k,m返回值都为1,有大神能帮我分析问题在哪里么?

解决方案 »

  1.   

    既然是自己的vba项目,用定时功能执行按钮的功能,何须模拟点击?
      

  2.   

    借这个问题可以好好认识一下window API 函数阿
      

  3.   

    模拟点击有专门的消息。
    Call PostMessage(j, BM_CLICK, 0&, ByVal 0&)
      

  4.   

    使用
    按键精灵软件

    autohotkey软件
      

  5.   

    楼主,你确认你的这句:
    j = FindWindowEx(i, 0, vbNullString, myButton1)
    一定能找到你的按钮句柄???
    查找句柄是否成功都不验证一下(不过很遗憾的是,根本不会成功!),就PostMessage,能正确执行才怪!VBA中有捷径Application.OnTime不走,偏偏要去走一条根本走不通的路。
    Useform中的铵钮根本找不到它的句柄,你怎么去通过API发消息来操作???