2013-02-01 2 views
3

나는 파이썬 응용 프로그램을 개발 중이며 열려있는 각 창을 HWND 개까지 가져오고 싶습니다. 윈도우의 이름과 HWND이 목록을 필터링하여 특정 윈도우를 관리하고 이동하고 크기를 조정해야합니다.각 창에 HWND 가져 오기?

저는 정보를 찾고자 노력했지만 올바른 코드를 얻지 못했습니다. 나는이 code으로 시도했지만 각각의 창 (그 위대한)의 제목 만 얻었지만 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 
+3

쇼핑 목록과 함께 가고 다른 사람들이 당신을 위해 일할 수있는 슈퍼마켓이 아닙니다. 너 스스로 무엇을 했니? – Difusio

+0

@Difusio : 나는 주변에서 정보를 찾고자 노력했지만 올바른 코드를 얻지 못했습니다. 나는이 http://sjohannes.wordpress.com/2012/03/23/win32-python-getting-all-window-titles/로 해봤지만 각각의 윈도우 (위대한) 제목 만 얻었지만, HWND도. – user1618465

+3

귀하가받은 _errors_ 또는 수행 한 다른 일들과 함께 작성한 _code_ _ _ _을 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 알려주십시오. –

답변

16

ctypeswin32gui이 섞여 있습니다.
hwndctypes을 통해 얻으며 LP_c_long 개체입니다. 그래서 win32gui.MoveWindow이 동의하지 않습니다. 당신이 win32gui.MoveWindow를 사용하려는 경우 당신은 당신이 직접 콜백으로 파이썬 기능을 사용할 수 있습니다

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

에 전달한다.
예를 들어,

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) 
+0

완벽한 !! 처음에 나 자신을 설명하지 않으면 많이 고마워하고 미안해 !! ;) – user1618465

+0

위대한 답변! 3 개의 모니터에서 브라우저 창을 점프했습니다 .-D – ssc

0

당신이 0 win32gui.EnumChildWindows에 전달 가능한 모든 메인 윈도우의 핸들을 얻으려면 다음 확인하십시오 확실히 윈도우 이후 0보다 긴 길이의 텍스트를 (이 당신은 오직 숨겨진/임시/팝업/특별 창) 숨겨진되지 않은 실제 창 싶어요. titles 목록은 다음 HWND 제목 텍스트가 포함 된 튜플의 목록이 될 것입니다

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

:이 같은 무언가를 그래서

1

그냥 모든 타이틀을 얻기 위해 code의 조각을 수정합니다.

+0

대단히 감사합니다.하지만 이것은 happends입니다 : (<__ main __. LP_c_long object at 0x022A9030>, u'Spotify ') int를 얻지는 않지만 나중에 win32gui.MoveWindow (hwnd, 0, 0, 760, 500)와 함께 사용합니다. , True). 이 번호를 어떻게 얻을 수 있습니까 ?? – user1618465

+0

귀하의 도움으로 해당 게시물을 업데이트했습니다. 하지만 win32gui.MoveWindow() 함수에서 HWND 값을 사용할 수 없습니다. 왜? – user1618465

+0

이론 상으로는 'hwnd.contents.value'를 사용하여 정수 값을 얻을 수 있어야하지만 내 시스템에서는 알 수없는 이유로 정지합니다. 문제는'ctypes'' PyHANDLE'과'win32'' c_long' 타입을 혼합하는 것입니다. 나는 @abarnert가 그들을 혼합하는 것을 피하는 올바른 생각을 가지고 있다고 생각합니다. – martineau

2

값을 저장하지 않는 원래 문제가 martineau에서 수정되었으므로 ctypeswin32gui을 섞어야합니다.

당신이하고있는 것을 알고 있다면 그렇게 할 수 있습니다. 그렇지 않다면 그냥하지 마십시오.

win32gui과 함께 사용할 수있는 창 핸들을 얻으려면 user32 DLL에서 raw 함수를 호출하는 대신 win32gui.EnumWindows을 사용하십시오.

관련 문제