win10下呼叫mouse_event的API函式,無法識別Or連接,代碼混亂。
win10下呼叫mouse_event函式,進行移動滑鼠操作,發現執行命令,無法實作移動。
代碼如下:
Private Declare Sub mouse Lib "user32" Alias "mouse_event" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Private Declare Function GetSystemMetrics32 Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long '獲取解析度
Private Const MOUSEEVENTF_ABSOLUTE = &H8000 '指定滑鼠使用絕對坐標系,此時,螢屏在水平和垂直方向上均勻分割成65535×65535個單元
Private Const MOUSEEVENTF_MOVE = &H1 '移動滑鼠
Private Const MOUSEEVENTF_LEFTDOWN = &H2 '模擬滑鼠左鍵按下
Private Const MOUSEEVENTF_LEFTUP = &H4 '模擬滑鼠左鍵抬起
Private Sub shubiaoyidong(ByVal x As Long, ByVal y As Long)
mw = x* 65535 / GetSystemMetrics32(0)
mh = y * 65535 / GetSystemMetrics32(1)
'移動
mouse MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE, mw, mh, 0, 0
End Sub
Sub test()
shubiaoyidong 998, 745
End Sub
點擊宏運行后,發現滑鼠在win10下無法移動,無法執行命令,這里不知道出了什么問題?
如何將Or改成符號&,則雖然可以這些命令,但是執行命令程序中會實作滑鼠右鍵點擊的功能,出現執行混亂的情況,代碼不能正常執行,請問大神能找出問題在哪么?我問過相關的經驗人員也不能給出合理回答,請各位大神老師幫忙指點一下!
uj5u.com熱心網友回復:
為什么在Win10下無效不清楚,你可以嘗試將其暫時改為Call Mouse(&H8001,mw,mh,0,0)
理論講Or不可能不能識別(&H8001 = &H8000 Or &H1)
或者嘗試更換引數試一下
另
Or是位運算,&是字符連接符,其意義應該是不一樣的
與Or相對應的是And Xor Not這三個
此處Or表示 采取絕對坐標模擬滑鼠移動
不明白你為什么想將Or改為 &
具體,你可以嘗試寫一個程式輸出 Or 連接、&連接、與And連接的結果,看一下區別
uj5u.com熱心網友回復:
哈哈哈哈,這個問題也曾經困擾我。下面講講原因,嫌煩直接看最后解決辦法。
你是看了API檔案了吧 ,而且看了C語言的呼叫樣例了吧。
const int MOUSEEVENTF_MOVE = 0x0001; 移動滑鼠
const int MOUSEEVENTF_ABSOLUTE = 0x8000; 標示是否采用絕對坐標
然后按照絕對坐標移動就是
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 500, 500, 0, 0);
翻譯成VB代碼
Public Const MOUSEEVENTF_MOVE = &H1 ' mouse move
Public Const MOUSEEVENTF_ABSOLUTE = &H8000 ' absolute move
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE, 500, 500, 0, 0)
然后就不靈光了。覺得匪夷所思,直接幫忙算了一下 MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE = &H8000 or &H1 = &H8001
直接把&H8001寫進代碼
mouse_event(&H8001, 500, 500, 0, 0)
還是不靈光!!!!

根本的原因在于:VB里十六進制表達結果的自動型別轉換。能用兩個位元組的情況就轉成integer,如果超過兩個位元組不到4個位元組的情況轉成long。在記憶體價格高的90年代這種做法是聰明的合理的。但是我們抄C代碼的時候要多個心眼。VB的整形都是有符號的。&H8001在轉換為intger的時候最高位的符號位是1!!!變成了負數。API呼叫的時候這個引數要傳長整形,于是轉換的程序中這個長整形也是負數……
接下來你在立即視窗里連續做幾個試驗:
print &H8001 :得到-32767 而不是 你想要的 32769
print val(&H8001) : 得到的還是 -32767 而不是 你想要的 32769
print hex(&H8001): 得到 8001 這個看上去理所當然。
print hex(-32767):得到 8001 如果上面三行好理解那么這個也好理解了。
print hex(32769):得到 8001 有沒有想罵娘?但你又罵不出來,這個也對啊。
print hex(val(&H8001)):得到 FFFF8001 不是你想像的8001,想掀桌子了是吧(╯‵□′)╯︵┻━┻ 這就是你呼叫失敗的原因!!
廢話那么多,如果腦袋一時半會兒繞不過來,直接給解決方法:
直接用十進制宣告一個常量
Public Const MOUSEEVENTF_ABSOLUTE_MOVE = 32769 '適用于VB的絕對移動引數
接下來直接呼叫這個常數:
mouse_event(MOUSEEVENTF_ABSOLUTE_MOVE , 500, 500, 0, 0)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/247414.html
標籤:API
