Python基礎シリーズ説明-自動制御windowsデスクトップ

7983 ワード

PCを使用するときにPCと対話する主な方法は、画面の表示を見たり、音を聞いたり、マウスをクリックしたり、キーボードを叩いたりすることです.自動化されたオフィスのトレンドの下で、煩雑な仕事はプログラムを自動的に完成させることができます.例えば、テストの自動化、自動注文取引などです.多くのソフトウェアはGUI方式で操作できるほか、CLIインタフェースで操作できるが、一部のソフトウェアがCLIインタフェースを提供していない場合、私たちはどうすればいいのだろうか.また、プログラムでデスクトップのウィンドウを制御したり、マウスをクリックしたり、キーボードを押したりする動作をシミュレートして、自分を解放することもできます.
pywin 32はPythonライブラリで、PythonにWindows APIへのアクセスの拡張を提供し、windows定数、インタフェース、スレッド、COMメカニズムなどが完備されており、インストール後にpythonwinのIDEが付属します.次に、Pythonでwindowsデスクトップソフトウェアを操作する方法を紹介します.
1、Googleブラウザを開く、wordファイルを開くなど、ソフトウェアやファイルを開きます.以下のようにします.
win32api.ShellExecute(1, 'open',
 r'C:Program Files (x86)GoogleChromeApplicationchrome.exe',
 '', '', 1)
win32api.ShellExecute(1, 'open',
 r'C:UsersJayDesktopEnvironment Guider.docx',
 '', '', 1)

win32api.ShellExecute()のパラメータは主に次のとおりです.
HWND:親ウィンドウハンドルの指定
Operation:アクションを指定します.たとえば、「edit」、「explore」、「open」、「find」、「print」、「NULL」などです.
FileName:開くファイルまたはプログラムを指定します
Parameters:プログラムを開くために必要なパラメータを指定します
Directory:デフォルトディレクトリ
ShowCmd:オプションを開きます.オプション:
  • •SW_HIDE = 0; {ウィンドウを非表示にし、アクティブな状態を1つのウィンドウに与える}
  • •SW_SHOWNORMAL = 1; {最近のサイズと位置でウィンドウを表示し、アクティブにする}
  • •SW_NORMAL = 1; {現在のサイズと位置でウィンドウを表示し、アクティブなウィンドウを変更しない}
  • •SW_SHOWMINIMIZED = 2; {ウィンドウを最小化してアクティブ化}
  • •SW_SHOWMAXIMIZED = 3; {ウィンドウを最大化してアクティブ化}
  • •SW_MAXIMIZE = 3; {同SW_SHOWMAXIMIZED}
  • •SW_SHOWNOACTIVATE = 4; {最も近いサイズと位置でウィンドウを表示し、アクティブなウィンドウを変更しない}
  • •SW_SHOW = 5; {現在のサイズと位置でウィンドウを表示し、アクティブにする}
  • •SW_MINIMIZE = 6; {ウィンドウを最小化、非アクティブ化}
  • •SW_SHOWMINNOACTIVE = 7; {同SW_MINIMIZE}
  • •SW_SHOWNA = 8; {現在のサイズと位置でウィンドウを表示し、アクティブなウィンドウを変更しない}
  • •SW_RESTORE = 9; {同SW_SHOWNORMAL}
  • •SW_SHOWDEFAULT = 10; {同SW_SHOWNORMAL}
  • •SW_MAX = 10; {同SW_SHOWNORMAL}
  • 実行に成功するとアプリケーションハンドルが返され、値<=32を返すと実行エラーが表示されます.戻り値のエラーは次のとおりです.
    0——{メモリ不足}
    2——{ファイル名エラー}
    3——{パス名エラー}
    11——{EXEファイルが無効です}
    26——{共有エラー発生}
    27-{ファイル名が不完全または無効です}
    28——{タイムアウト}
    29——{DDEトランザクション失敗}
    30-{DDEトランザクションが他のDDEトランザクションを処理中であり、DDEトランザクションを完了できない}
    31-{関連アプリケーションなし}
    2、フォームのハンドルを検索します.win 32プログラミングの世界では、ウィンドウからテキストボックスまでのすべてのコントロールがフォームであり、すべてのフォームには独立したハンドルがあります.いずれかのフォームを操作するには、このフォームのハンドルを見つける必要があります.ハンドルは32ビットの整数で、windowsでオブジェクトをマークするために使用されます.例えばSnipping ToolとNew Text Documentを検索します.txtのハンドルは、次のようになります.
    para_hld = win32gui.FindWindow(None, "Snipping Tool")# 1836416
    para_hld = win32gui.FindWindow(None, "New Text Document.txt - Notepad")# 591410
    

    win32gui.FindWindow()はwin 32 guiのモジュールに属し、最上位ウィンドウ(つまりデスクトップ)から条件が一致するフォームの検索を開始し、このフォームのハンドルを返します.この関数はメインウィンドウのみを検索できるため、サブウィンドウを検索したり、大文字と小文字を区別したりすることはできません.見つからない場合は0を返します.
    win32gui.FindWindow()のパラメータには、主に(lpClassName=None、lpWindowName=None)が含まれます.
    •lpClassName:文字型、フォームのクラス名、Spy++で見つけることができます
    •lpWindowName:文字型、ウィンドウ名、つまりタイトルバーに見えるタイトルです.
    3、ハンドルのクラス名とタイトルを検索します.例えばSnipping ToolとNew Text Documentによって.txtのハンドルは、次のように対応するクラス名とタイトルを検索します.
    title = win32gui.GetWindowText(1836416)
    classname = win32gui.GetClassName(1836416)
    print "windows handler:{0}; title:{1}; classname:{2}".format(1836416, title, classname)
    

    印刷は次のように表示されます.
    windows handler:1836416; title:Snipping Tool; classname:Microsoft-Windows-Tablet-SnipperToolbar
    title = win32gui.GetWindowText(591410)
    classname = win32gui.GetClassName(591410)
    print "windows handler:{0}; title:{1}; classname:{2}".format(591410, title, classname)
    

    印刷は次のように表示されます.
    windows handler:591410; title:New Text Document.txt - Notepad; classname:Notepad
    

    4、win 32 guiを呼び出す.EnumWindows()はすべてのウィンドウハンドルを列挙し、最後の最上位ウィンドウが列挙されるまで列挙プロセスを停止します.次のようになります.
    hWndList = []
    win32gui.EnumWindows(lambda hWnd, param: param.append(hWnd), hWndList)
    print hWndList
    for hwnd in hWndList:
     title = win32gui.GetWindowText(hwnd)
     print title
    

    印刷は次のように表示されます.
    [852802L, 65946L, 65928L, 65930L, 65900L, 65920L, 65924L, 65922L, 65944L, 65892L, 65886L, 6817870L, 65960L, 6031410L, …… 66052L, 65734L]
    ……
    New Text Document.txt - Notepad
    Snipping Tool
    DDE Server Window
    OfficePowerManagerWindow
    OfficePowerManagerWindow
    DDE Server Window
    GDI+ Window
    Global Internet Access
    ……
    

    5、win32gui.SetForegroundWindow()関数は、指定したフォームを最上位レベルに設定し、ウィンドウをアクティブにします.
    コンストラクション関数はwin 32 gui.SetWindowPos(HWN hWnd,HWND hWndlnsertAfter, int X,int Y, int cx,int cy, UNIT.Flags)
    win 32 guiについてSetForegroundWindow(para_hld)エラーの問題:
    pywintypes.error: (0, ‘SetForegroundWindow’, ‘No error message is available’)
    実はSetForegroundWindow()を呼び出すには多くの制限があります.公式サイトの説明を参照してください.https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setforegroundwindow
    したがって、SetForegroundWindow()を呼び出すときは、現在実行されている条件が上記の要件を満たしているかどうかを確認する必要があります.ここでは、SetForegroundWindow()を呼び出す前に、キーボードeventを事前に送信して問題を解決します.
    インスタンスは次のとおりです.
    win32api.keybd_event(13, 0, 0, 0) #
    win32gui.SetForegroundWindow(para_hld)
    

    6、win32api.keybd_event()はキーボード入力をシミュレートします.
    コンストラクション関数は次のようになります.
    win32api.keybd_event (bVk, bScan, dwFlags, dwExtraInfo)
    •bVk:仮想キーコード(キーボードキーコード対照表は付録を参照);
    •bScan:ハードウェアスキャンコードは、一般的に0に設定すればよい.
    •dwFlags:関数操作のフラグビット.値がKEYEVENTF_の場合EXTENDEDKEYはこのキーが押されても0に設定してもよく、値がKEYEVENTF_であればKEYUPはこのボタンが解放される.
    •dwExtraInfo:キーストロークに関連する追加の32ビット値を定義します.一般的には0に設定します.
    Enterキーを押して持ち上げるルーチンは以下の通りです.
    win32api.keybd_event(13,0,0,0) # enter
    win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0) #    
    

    7、マウス入力をシミュレートします.次のように、インスタンスを直接指定します.
    #            
    print win32api.GetCursorPos()
    #          
    win32api.SetCursorPos((100, 100))
    #    
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 100, 100, 0, 0)
    time.sleep(2)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 100, 100, 0, 0)
    

    8、マウスキーボードの操作についてはPyUserInputライブラリを使用することもできます.PyUserInputはpythonのプラットフォーム間でマウスとキーボードを操作するモジュールで、使いやすいです.サポートされるプラットフォームと依存度は次のとおりです.
    •Linux - Xlib
    •Mac - Quartz, AppKit
    •Windows - pywin32, pyHook
    次のように、マウスとキーボードのオブジェクトをインスタンス化します.
    from pymouse import PyMouse
    from pykeyboard import PyKeyboard
    m = PyMouse()
    k = PyKeyboard()
           ,    :
    m.click(190,70,1)#     xy    
    time.sleep(2)
    m.click(190, 200, 1)#     xy    
    time.sleep(2)
    k.tap_key(k.function_keys[5])#–     F5
    

    仲间たちにはわからないところがあるので、コメントしてもいいですよ!
    転載先:https://juejin.im/post/5d259b0ef265da1bc37f372f