2 回答

TA貢獻1844條經驗 獲得超8個贊
不知道你解決了沒,最近正好研究python。
hwnd=win32gui.FindWindow()這個獲取窗體句柄,大概都會用;
ctrl=win32gui.FindWindowEx(hwnd,None,'窗口類名',‘標題文本’)已知控件類名或控件名時獲取控件句柄,這個標題文本不一定存在,所以使用None默認值獲取的是該窗口類名中第一個順位的控件句柄。
你使用b=win32gui.GetDlgItem(edit,資源ID)最終結果是獲取的是句柄,這里的資源ID其實是spy++中的窗口ID,句柄是可變的,窗口ID是不可變的。這里似乎錯了,你這樣子大概獲取的是控件中的子項(控件有子項的話,比如Combox中的edit框),我猜的,沒試過。b=win32gui.GetDlgItem(hwnd,窗口ID)是已知ID下獲取某控件句柄
如果你想獲取某個控件的ID則ctrlid=win32gui.GetDlgCtrlID(ctrl)這是一只某控件句柄的情況下獲取該控件在應用程序中的窗口ID。
如果不知控件句柄的情況下大概可以試試spy++獲取窗口ID,把窗口ID(這個是16進制的)轉化成10進制帶進b=win32gui.GetDlgItem(hwnd,窗口ID)大概也可以得到控件句柄。
其實就是三個函數之間的轉化
ctrl=win32gui.FindWindowEx(hwnd,None,'edit',None)控件句柄
ctrlid=win32gui.GetDlgCtrlID(ctrl)控件的窗口id
ctrl2=win32gui.GetDlgItem(hwnd,ctrlid)控件句柄
print "%x" %ctrllist
print "%x" %ctrlid
print "%x" %ctrl
輸出,看一下數據與spy++是否一致。然后ctrl=ctrl2

TA貢獻1828條經驗 獲得超4個贊
1.如何利用句柄操作windows窗體
首先,獲得窗體的句柄 win32api.FindWindows()
第二,獲得窗體中控件的id號,spy++
第三,根據控件的ID獲得控件的句柄(hwnd) GetDlgItem(hwnd,loginID)
最后,利用控件句柄進行操作
python可以通過win32api輕松獲取控件的屬性值
通過標簽找到主窗口句柄,然后通過主句柄獲取下屬控件句柄
#-*- coding: utf-8 -*- ##設置編碼方式
import win32api,win32gui,win32con
label = 'tt' #此處假設主窗口名為tt
hld = win32gui.FindWindow(None, label)
if hld > 0:
dlg = win32api.FindWindowEx(hld, None, 'Edit', None)#獲取hld下第一個為edit控件的句柄
buffer = '0' *50
len = win32gui.SendMessage(dlg, win32con.WM_GETTEXTLENGTH)+1 #獲取edit控件文本長度
win32gui.SendMessage(dlg, win32con.WM_GETTEXT, len, buffer) #讀取文本
print buffer[:len-1]
#虛擬鼠標點擊按鈕(或者回車)
btnhld = win32api.FindWindowEx(hld, None,'Button', None)
# win32gui.PostMessage(btnhld, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
# win32gui.PostMessage(btnhld, win32con.WM_KEYUP, win32con.VK_RETURN, 0)
win32gui.PostMessage(btnhld, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, 0)
win32gui.PostMessage(btnhld, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, 0)
#獲取顯示器屏幕大小
width = win32api.GetSystemMetrics(win32con.SM_CXSCREEN)
height = win32api.GetSystemMetrics(win32con.SM_CYSCREEN)
#點擊窗口button
w=win32ui.FindWindow(clsname,windowtitle)
b=w.GetDlgItem(窗口id)
b.postMessage(win32con.BM_CLICK)
#關閉窗體
import win32ui
import win32con
wnd=win32ui.FindWindow(classname,None)
wnd.SendMessage(win32con.WM_CLOSE) 成功!
import win32ui
w=win32ui.FindWindow(classname,窗體title)
print w.GetDlgItemText(0xFFFF) # 獲得彈窗里的消息文字
最小化窗體
w=win32gui.FindWindow()
win32gui.CloseWindow(w)
添加回答
舉報