9

私はPythonアプリケーションを開発していて、HWND開いている各ウィンドウを取得したいと思っています。ウィンドウの名前とHWND、リストをフィルタリングして特定のウィンドウを管理し、それらを移動およびサイズ変更する必要があります。

私は自分で情報を探してそれをやろうとしましたが、正しいコードを取得できませんでした。このコードを試してみましたが、各ウィンドウのタイトルしか取得できません(これはすばらしいことです)が、必要なこともありHWNDます。

import ctypes
import win32gui
EnumWindows = ctypes.windll.user32.EnumWindows
EnumWindowsProc = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int))
GetWindowText = ctypes.windll.user32.GetWindowTextW
GetWindowTextLength = ctypes.windll.user32.GetWindowTextLengthW
IsWindowVisible = ctypes.windll.user32.IsWindowVisible

titles = []
def foreach_window(hwnd, lParam):
    if IsWindowVisible(hwnd):
        length = GetWindowTextLength(hwnd)
        buff = ctypes.create_unicode_buffer(length + 1)
        GetWindowText(hwnd, buff, length + 1)
        titles.append((hwnd, buff.value))
    return True
EnumWindows(EnumWindowsProc(foreach_window), 0)

for i in range(len(titles)):
    print(titles)[i]

win32gui.MoveWindow((titles)[5][0], 0, 0, 760, 500, True)

ここにエラーがあります:

win32gui.MoveWindow((titles)[5][0], 0, 0, 760, 500, True)
 TypeError: The object is not a PyHANDLE object
4

4 に答える 4

30

ctypesとを混同しましたwin32gui
あなたhwndが持っている は経由で取得されctypesLP_c_longオブジェクトです。win32gui.MoveWindowそれが受け入れられなかった理由です。あなたはそれを渡す必要があります

ctypes.windll.user32.MoveWindow(titles[5][0], 0, 0, 760, 500, True)

を使用する場合win32gui.MoveWindowは、python 関数をコールバックとして直接使用できます。
例えば、

import win32gui

def enumHandler(hwnd, lParam):
    if win32gui.IsWindowVisible(hwnd):
        if 'Stack Overflow' in win32gui.GetWindowText(hwnd):
            win32gui.MoveWindow(hwnd, 0, 0, 760, 500, True)

win32gui.EnumWindows(enumHandler, None)
于 2013-02-01T20:16:03.157 に答える
2

あなたの問題(マルティノーが値をまったく保存しないという元の問題を修正したので)は、 と を混ぜよHWNDうとしていることctypesですwin32gui

自分が何をしているのかわかっていればそれを行うことができますが、そうでない場合はやらないでください。

で使用できるウィンドウ ハンドルを取得する場合は、 DLLから raw 関数を呼び出す代わりに をwin32gui使用します。win32gui.EnumWindowsuser32

于 2013-02-01T20:07:17.937 に答える
1

すべてのタイトルを取得するためのコードを変更するだけで、次のようになります。

titles.append((hwnd, buff.value))

リストは、HWNDとタイトルテキストを含むタプルのtitlesリストになります。

于 2013-02-01T19:22:41.493 に答える
1

使用可能なすべてのメイン ウィンドウのハンドルを取得するには、0 を渡してからwin32gui.EnumChildWindows、ウィンドウに 0 より長いテキストがあることを確認します (非表示/一時/ポップアップ/特別ウィンドウではなく、実際のウィンドウのみが必要なため)。

于 2013-02-01T19:14:04.043 に答える