project:peekwindow
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판이전 판다음 판 | 이전 판다음 판양쪽 다음 판 | ||
project:peekwindow [2015/08/08 18:35] – [2015년 08월 09일 내용 추가] changwoo | project:peekwindow [2015/08/08 19:32] – changwoo | ||
---|---|---|---|
줄 360: | 줄 360: | ||
한 클리앙 회원분께서 이메일로 " | 한 클리앙 회원분께서 이메일로 " | ||
예전 파이썬을 막 시작할 때 코드를 잠시 보다가 개정도 할 겸, 답변도 드릴 겸 코드를 조금 수정하기로 맘 먹었습니다. | 예전 파이썬을 막 시작할 때 코드를 잠시 보다가 개정도 할 겸, 답변도 드릴 겸 코드를 조금 수정하기로 맘 먹었습니다. | ||
+ | |||
+ | ==== ListView Peek ==== | ||
+ | 타겟이 되는 리스트뷰에 적절히 원하는 이벤트를 날려주는 코드. | ||
<code python listview_peek.py> | <code python listview_peek.py> | ||
줄 476: | 줄 479: | ||
</ | </ | ||
+ | === 설명 === | ||
이전 코드의 약간 손보아 리스트 뷰에 대해 딱 필요한 기능을 꺼내 쓸 수 있도록 고쳤습니다. 그리고 이전에 생략한 설명을 첨부하도록 할께요. 어차피 혹시 또 코드를 볼 때가 있다면 다시 빨리 기억하기 편할 테니까요. | 이전 코드의 약간 손보아 리스트 뷰에 대해 딱 필요한 기능을 꺼내 쓸 수 있도록 고쳤습니다. 그리고 이전에 생략한 설명을 첨부하도록 할께요. 어차피 혹시 또 코드를 볼 때가 있다면 다시 빨리 기억하기 편할 테니까요. | ||
- | 우선 LVItem 클래스는 | + | 우선 LVItem 클래스는 |
+ | ListViewPeek 클래스가 본 기능을 하는 녀석입니다. 생성 인자로 리스트뷰 컨트롤의 핸들을 넘겨 주도록 되어 있죠. 생성자에서는 [[https:// | ||
+ | |||
+ | [[https:// | ||
+ | |||
+ | 리스트의 각 아이템 텍스트를 가져오는 방법은 이렇습니다. [[http:// | ||
+ | |||
+ | 우선 제대로 이벤트를 던지면 p_buf에는 각 항목의 텍스트가 복사됩니다. WinAPI가 여기까지는 해 줍니다. 그 다음 | ||
+ | ''< | ||
+ | |||
+ | 리스트의 각 항목을 선택하려면 [[https:// | ||
+ | |||
+ | * mask: state를 변경하는 것이므로 '' | ||
+ | * state: [[https:// | ||
+ | * stateMask: '' | ||
+ | * 이외: 이외의 필드는 0으로 해도 무방합니다. | ||
+ | |||
+ | 그런데 TeraCopy는 ListView Control에서 LVM_SETITEMSTATE 이벤트를 제대로 수신하지 않습니다. ListView Control을 이용한 다른 앱을 이용해서 확인하기 바랍니다. 추정컨데 TeraCopy는 [[https:// | ||
+ | |||
+ | ==== Control Picker ==== | ||
+ | ListView Control를 찾아내고 조정하는 역할을 합니다. | ||
+ | |||
+ | <code python control_picker.py> | ||
+ | # -*- coding: utf-8 | ||
+ | import win32gui | ||
+ | import pywintypes | ||
+ | from listview_peek import ListViewPeek | ||
+ | |||
+ | |||
+ | class ControlPicker: | ||
+ | def __init__(self, | ||
+ | self.parent_window_handle = 0 | ||
+ | self.child_windows = [] | ||
+ | |||
+ | try: | ||
+ | win32gui.EnumWindows(self.__enum_window_handler, | ||
+ | except pywintypes.error as e: | ||
+ | if e[0] == 0: | ||
+ | pass | ||
+ | |||
+ | win32gui.EnumChildWindows(self.parent_window_handle, | ||
+ | |||
+ | def __enum_window_handler(self, | ||
+ | window_text = win32gui.GetWindowText(window_handle) | ||
+ | if window_text.find(extra) != -1: | ||
+ | self.parent_window_handle = window_handle | ||
+ | return pywintypes.FALSE | ||
+ | |||
+ | def __enum_child_window_handler(self, | ||
+ | self.child_windows.append(window_handle) | ||
+ | |||
+ | def pick_control(self, | ||
+ | for child_window in self.child_windows: | ||
+ | window_class = win32gui.GetClassName(child_window) | ||
+ | control_id = win32gui.GetDlgCtrlID(child_window) | ||
+ | |||
+ | if window_class != target_class_name: | ||
+ | continue | ||
+ | |||
+ | if target_control_id: | ||
+ | if target_control_id == control_id: | ||
+ | return child_window | ||
+ | else: | ||
+ | return child_window | ||
+ | |||
+ | |||
+ | if __name__ == ' | ||
+ | import sys | ||
+ | import time | ||
+ | |||
+ | picker = ControlPicker(' | ||
+ | list_view_control = picker.pick_control(' | ||
+ | if not list_view_control: | ||
+ | print " | ||
+ | sys.exit(1) | ||
+ | |||
+ | peek = ListViewPeek(list_view_control) | ||
+ | |||
+ | print "There are %d items in the ListView control!" | ||
+ | for x in peek.get_list_items(): | ||
+ | print x | ||
+ | |||
+ | |||
+ | if peek.get_item_count() < 2: | ||
+ | print "Make sure Subrenamer has enough unmatched video lists!" | ||
+ | sys.exit(1) | ||
+ | |||
+ | pause = 5 | ||
+ | win32gui.SetActiveWindow(picker.parent_window_handle) | ||
+ | win32gui.SetForegroundWindow(list_view_control) | ||
+ | print " | ||
+ | time.sleep(pause) | ||
+ | |||
+ | peek.select_item(-1, | ||
+ | print "No item selected. %d seconds sleep..." | ||
+ | time.sleep(pause) | ||
+ | |||
+ | peek.select_item(0, | ||
+ | print "The first item selected. %d seconds sleep..." | ||
+ | time.sleep(pause) | ||
+ | |||
+ | peek.select_item(-1, | ||
+ | peek.select_item(1, | ||
+ | print "The second item selected. %d seconds sleep..." | ||
+ | time.sleep(pause) | ||
+ | |||
+ | peek.select_item(-1, | ||
+ | print "All selected. %d seconds sleep..." | ||
+ | time.sleep(pause) | ||
+ | |||
+ | peek.select_item(-1, | ||
+ | print "None selected again." | ||
+ | print " | ||
+ | |||
+ | </ | ||
project/peekwindow.txt · 마지막으로 수정됨: 2015/08/08 20:22 저자 changwoo