VB 查詢遊戲視窗控制代碼的方法

2021-06-18 07:04:00 字數 3650 閱讀 7209

一般尋找視窗控制代碼都是直接findwindow吧,這樣是不行的,qq三國在這些函式上做了一些處理.我來給大家說個萬能的方法吧,

對於getwindowtext方法遊戲就管不到了,可以配合使用getwindow來列舉所有的視窗,再判斷列舉的視窗裡面是否含有遊戲視窗標題文字,

最後取其控制代碼就行了,下面我給段**,也給還有疑問的朋友一些幫助,嘻嘻!

option explicit

private declare function getdesktopwindow lib "user32" () as long

private declare function getwindow lib "user32" (byval hwnd as long, byval wcmd as long) as long

public declare function getwindowtext lib "user32" alias "getwindowtexta" (byval hwnd as long, byval lpstring as string, byval cch as long) as long

private const gw_child = 5

private const gw_hwndnext = 2

public function gethandle(title as string) as long

dim tmp as string

dim hwnd as long

dim lngprocid as long

dim strtitle as string * 255     '//用來儲存視窗的標題

'//取得桌面視窗

hwnd = getdesktopwindow()

'//取得桌面視窗的第乙個子視窗

hwnd = getwindow(hwnd, gw_child)

'//通過迴圈來列舉所有的視窗

do while hwnd <> 0

'//取得下乙個視窗的標題,並寫入到列表框中

getwindowtext hwnd, strtitle, len(strtitle)

if left$(strtitle, 1) <> vbnullchar then

tmp = left$(strtitle, instr(1, strtitle, vbnullchar))

if left(tmp, len(title)) = title then

gethandle=hwnd

end if

end if

'//呼叫getwindow函式,來取得下乙個視窗

hwnd = getwindow(hwnd, gw_hwndnext)

loop

end function

直接呼叫gethandle函式,然後傳乙個視窗標題進去就可以獲得其視窗控制代碼了.

[問題二,不能後台模擬按鍵]

一般傳送按鍵訊息都是sendmessage吧,也有用postmessage的,一般人用這兩個函式都不成功,於是就走向硬體級的模擬按鍵,

其實這是錯誤的,這樣反而離目標越來越遠,使用普通的postmessage就行了,有人問了,不是過濾了麼?

呵呵,讓我們重新來了解下鍵盤按鍵的流程吧,我也是初學的!

我們一般按下鍵盤,鍵盤會傳送自身對應的掃瞄碼,然後傳遞給系統,在系統中由對應的鍵盤驅動來處理此訊息,

但是不同的裝置掃瞄碼有可能不一樣,為了規範統一,於是出現了偽程式碼,驅動將掃瞄碼轉換成對應的偽程式碼後,

插入應用程式的訊息佇列中,等待應用程式處理,這樣乙個完整的流程就構成了,現在我們再來看看postmessage的函式原型吧.

bool postmessage(

hwnd hwnd, 

uint msg, 

wparam wparam, 

lparam lparam );

乙個引數是視窗控制代碼,第乙個問題中,我們已經得到.第二個引數是訊息的型別,一般的有按鍵按下訊息wm_keydown和按鍵彈起訊息wm_keyup.

第三個引數和第四個引數的附加的,一般普通的對乙個視窗傳送按鍵訊息就是:

postmessage whandle, wm_keydown, keycode, 0 '按下某鍵

普通的行,但對於qq三國來說就不行了,再看看上面的**有什麼被忽略了呢,細心的朋友發現了,缺少掃瞄碼,也就是第四個引數.

正常的按鍵都會有對應的掃瞄碼,如果沒有遊戲自然會認為是假的,呵呵,因此我們還要構造乙個掃瞄碼,怎麼構造呢,下面我給出完整的**:

option explicit

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

private declare function mapvirtualkey lib "user32" alias "mapvirtualkeya" (byval wcode as long, byval wmaptype as long) as long

private const wm_keydown = &h100

private const wm_keyup = &h101

private const wm_char = &h102

'//構造掃瞄碼

private function makekeylparam(byval virtualkey as long, byval flag as long) as long

dim s as string

dim firstbyte as string     'lparam引數的24-31位

if flag = wm_keydown then   '如果是按下鍵

firstbyte = "00"

else

firstbyte = "c0"        '如果是釋放鍵

end if

dim scancode as long

'獲得鍵的掃瞄碼

scancode = mapvirtualkey(virtualkey, 0)

dim secondbyte as string    'lparam引數的16-23位,即虛擬鍵掃瞄碼

secondbyte = right("00" & hex(scancode), 2)

s = firstbyte & secondbyte & "0001"   '0001為lparam引數的0-15位,即傳送次數和其它擴充套件資訊

makekeylparam = val("&h" & s)

end function

public function postkey(whandle as long, keycode as long) '//傳送按鍵

postmessage whandle, wm_keydown, keycode, makekeylparam(keycode, wm_keydown) '按下某鍵

postmessage whandle, wm_keyup, keycode, makekeylparam(keycode, wm_keyup)    '釋放某鍵

end function

上面就是乙個完整的實現方法了,makekeylparam是構造掃瞄碼,postkey是傳送按鍵訊息,直接呼叫該函式就行了!

vb以類名或視窗標題查詢控制代碼並關閉

新增 command1 private declare function findwindow lib user32 alias findwindowa byval lpclassname as string,byval lpwindowname as string as long private ...

MFC獲取視窗控制代碼的方法

afxgetmainwnd afxgetmainwnd獲取自身視窗控制代碼 hwnd hwnd afxgetmainwnd m hwnd gettopwindow 函式功能 該函式檢查與特定父視窗相聯的子視窗z序 z序 垂直螢幕的方向,即疊放次序 並返回在z序頂部的子視窗的控制代碼。函式原型 hwn...

獲取視窗的控制代碼方法總結

控制代碼獲取方法 獲取該視窗的控制代碼後,即可向該視窗類類傳送訊息 處理程式 例如 postmessage 控制代碼 wm user drawviewpic eds,0,0 0。獲取所在類視窗的控制代碼 this m hwnd 1。主視窗的控制代碼 無論在主視窗類內,還是子視窗類內,獲取主視窗控制代...