Pywin32-notepad

document

利用Python和win32編程范例按需定制一個按鍵精靈

SendMessage 用法詳解及消息詳解

用pywin32實(shí)現(xiàn)windows模擬鼠標(biāo)及鍵盤動作

PyWin32 Documentation

SetForegroundWindow的正確用法

WinAPI: FindWindow或颊、FindWindowEx - 查找窗口

通過ctypes的windll,user32實(shí)現(xiàn)調(diào)用win32api

python打包方法

在中文windows下使用pywinauto進(jìn)行窗口操作(一)

notepad保存扎谎,指定文件名和文件路徑

# coding=utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import os
import time
import win32gui
import win32api
import win32con

def find_idxSubHandle(pHandle, winClass, index=0):
    """已知子窗口的窗體類名 尋找第index號個同類型的兄弟窗口"""
    assert type(index) == int and index >= 0
    handle = win32gui.FindWindowEx(pHandle, 0, winClass, None)
    while index > 0:
        handle = win32gui.FindWindowEx(pHandle, handle, winClass, None)
        index -= 1
    return handle

def find_subHandle(pHandle, winClassList):
    """
    遞歸尋找子窗口的句柄
    pHandle是祖父窗口的句柄
    winClassList是各個子窗口的class列表,父輩的list-index小于子輩
    """
    assert type(winClassList) == list
    if len(winClassList) == 1:
        return find_idxSubHandle(pHandle, winClassList[0][0], winClassList[0][1])
    else:
        pHandle = find_idxSubHandle(pHandle, winClassList[0][0], winClassList[0][1])
        return find_subHandle(pHandle, winClassList[1:])

def p_sub_handle(phandle):
    """輸出phandle的所有子控件"""
    handle = -1
    while handle !=0 :
        if handle == -1:
            handle = 0
        handle = win32gui.FindWindowEx(phandle, handle, None, None)
        if handle != 0:
            print win32gui.GetClassName(handle)

hd_notepad = win32gui.FindWindow("notepad", None)
print win32gui.GetWindowText(hd_notepad)
#輸出notepad的窗口名稱
hd_menu = win32gui.GetMenu(hd_notepad)
hd_submenu = win32gui.GetSubMenu(hd_menu, 0)
#第一個子菜單
hd_menuid = win32gui.GetMenuItemID(hd_submenu, 2)
#從0開始盯腌,所以保存是第3個
win32gui.PostMessage(hd_notepad, win32con.WM_COMMAND, hd_menuid, 0)
#win32gui.SendMessage(hd_notepad, win32con.WM_COMMAND, hd_menuid, 0)
win32api.Sleep(200)
#必須有時(shí)間間隔孽锥,否則無法獲得handle
dig_handle = win32gui.FindWindow(None, u"另存為")
print win32gui.GetWindowText(dig_handle)
con_button_handle = win32gui.FindWindowEx(dig_handle, 0, "Button", None)
print win32gui.GetWindowText(con_button_handle)
#handle = find_subHandle(dig_handle, [("WorkerW", 0), ("ReBarWindow32", 0), ("Address Band Root", 0), ("msctls_progress32", 0), ("ComboBoxEx32",0), ("ComboBox", 0), ("Edit", 0)])
handle = find_subHandle(dig_handle, [("WorkerW", 0), ("ReBarWindow32", 0), ("Address Band Root", 0), ("msctls_progress32", 0)])
#沒有激活逮光,但是手動鼠標(biāo)單擊地址欄則激活成功

# win32gui.SendMessage(handle, win32con.WM_LBUTTONDOWN, 0, 0)
# win32api.Sleep(200)
# win32gui.SendMessage(handle, win32con.WM_LBUTTONUP, 0, 0)
#自動模擬激活失敗

handle = find_subHandle(dig_handle, [("DUIViewWndClassName", 0), ("DirectUIHWND", 0), ("FloatNotifySink", 0), ("ComboBox", 0), ("Edit", 0)])
#當(dāng)前handle為文件名
win32gui.SetForegroundWindow(handle)
#另存為窗口置頂
win32gui.SendMessage(handle, win32con.WM_LBUTTONDOWN, 0, 0)
win32api.Sleep(200)
win32gui.SendMessage(handle, win32con.WM_LBUTTONUP, 0, 0)
win32api.Sleep(200)
fgFilePath = "d:/1"
print win32gui.GetWindowText(handle)
print handle
print win32api.SendMessage(handle, win32con.WM_SETTEXT, 0, os.path.abspath(fgFilePath))
#第一次打開另存為卒落,不能輸入文件名话瞧,重新運(yùn)行程序則輸入成功

#如果類名不能獲取窗口句柄嫩与,文件名不能完整找到,可以枚舉窗口交排,需找符合條件的窗口划滋。
def findPicPick():
    hd_list = []

    #回調(diào)函數(shù)
    def foo(hwnd, mouse):
        # 去掉下面這句會使所有窗口都輸出
        if win32gui.IsWindow(hwnd) and win32gui.IsWindowEnabled(hwnd) and win32gui.IsWindowVisible(hwnd):
            #注意大寫
            #print win32gui.GetWindowText(hwnd)
            if "PicPick" in win32gui.GetWindowText(hwnd):
                hd_list.append(hwnd)

    win32gui.EnumWindows(foo, 0)

    #hd_notepad = win32gui.FindWindow("notepad", None) 成功
    #hd2 = win32gui.FindWindow(None, "TfrmMDIEditor") 失敗,找不到picpcik
    #print hd_notepad
    #print hd2

    win32api.keybd_event(18,0,0,0)    # Alt
    win32api.keybd_event(18, 0, win32con.KEYEVENTF_KEYUP, 0)
    win32api.keybd_event(70,0,0,0)    # F
    win32api.keybd_event(70, 0, win32con.KEYEVENTF_KEYUP, 0)

handle = win32gui.FindWindowEx(phandle, handle, None, None)
尋找pHandle的子控件埃篓,在handle之后的第一個子控件处坪,None 分別是類名和title。
hd_notepad = win32gui.FindWindow("notepad", None)
找到類名”notepad“, title = None 的窗口句柄

win32gui.GetClassName(handle)
win32gui.GetWindowText(hd_notepad)
win32api.Sleep(200)
win32gui.SetForegroundWindow(handle)
win32gui.EnumWindows(foo, 0)
win32api.keybd_event(18,0,0,0)    # Alt
win32gui.PostMessage(hd_notepad, win32con.WM_COMMAND, hd_menuid, 0)
win32gui.SendMessage(hd_notepad, win32con.WM_COMMAND, hd_menuid, 0)

post 沒有返回值架专,執(zhí)行完馬上返回同窘。
send 返回執(zhí)行結(jié)果,需要等程序執(zhí)行完成返回部脚。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末想邦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子委刘,更是在濱河造成了極大的恐慌丧没,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锡移,死亡現(xiàn)場離奇詭異呕童,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)罩抗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門拉庵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人套蒂,你說我怎么就攤上這事钞支。” “怎么了操刀?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵烁挟,是天一觀的道長。 經(jīng)常有香客問我骨坑,道長撼嗓,這世上最難降的妖魔是什么柬采? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮且警,結(jié)果婚禮上粉捻,老公的妹妹穿的比我還像新娘。我一直安慰自己斑芜,他們只是感情好肩刃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著杏头,像睡著了一般盈包。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上醇王,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天呢燥,我揣著相機(jī)與錄音,去河邊找鬼寓娩。 笑死叛氨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的根暑。 我是一名探鬼主播力试,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼排嫌!你這毒婦竟也來了畸裳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤淳地,失蹤者是張志新(化名)和其女友劉穎怖糊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颇象,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伍伤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了遣钳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扰魂。...
    茶點(diǎn)故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蕴茴,靈堂內(nèi)的尸體忽然破棺而出劝评,到底是詐尸還是另有隱情,我是刑警寧澤倦淀,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布蒋畜,位于F島的核電站,受9級特大地震影響撞叽,放射性物質(zhì)發(fā)生泄漏姻成。R本人自食惡果不足惜插龄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望科展。 院中可真熱鬧均牢,春花似錦、人聲如沸辛润。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽砂竖。三九已至,卻和暖如春鹃答,著一層夾襖步出監(jiān)牢的瞬間乎澄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工测摔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留置济,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓锋八,卻偏偏與公主長得像浙于,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子挟纱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容