最近公司用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,有大神能幫我分析問題在哪里么?
uj5u.com熱心網友回復:
自己頂
uj5u.com熱心網友回復:
既然是自己的vba專案,用定時功能執行按鈕的功能,何須模擬點擊?uj5u.com熱心網友回復:
到時間,呼叫一下功能代碼,就好了啊。
點毛點。
uj5u.com熱心網友回復:
已經去掉按鈕正常運行了。只是感覺這是不得已的選擇,有高人能夠指點一下如果不去掉按鈕,怎么樣實作?
uj5u.com熱心網友回復:
借這個問題可以好好認識一下window API 函式阿
uj5u.com熱心網友回復:
模擬點擊有專門的訊息。Call PostMessage(j, BM_CLICK, 0&, ByVal 0&)
uj5u.com熱心網友回復:
使用按鍵精靈軟體
或
autohotkey軟體
uj5u.com熱心網友回復:
使用按鍵精靈的話,肯定是使用鍵盤按鍵了,那個會在螢屏鎖屏后,失效的。uj5u.com熱心網友回復:
樓主,你確認你的這句:
j = FindWindowEx(i, 0, vbNullString, myButton1)
一定能找到你的按鈕句柄???
查找句柄是否成功都不驗證一下(不過很遺憾的是,根本不會成功!),就PostMessage,能正確執行才怪!
VBA中有捷徑Application.OnTime不走,偏偏要去走一條根本走不通的路。

Useform中的銨鈕根本找不到它的句柄,你怎么去通過API發訊息來操作???
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/93893.html
標籤:VBA
