Chcę uzyskać uchwyt każdego nowego okna dialogowego, które wyskakuje z określonej aplikacji.
Rozumiem, że powinienem ustawić hak z SetWinEventHook, który jest w user32.dll
w oknach, ale nie wiem jak to zrobić w pythonie. Dałbyś mi przykład?Jak korzystać z Winapi SetWinEventHook w python?
Odpowiedz
Oto bardzo prosty przykład, który wypisuje na konsoli tekst dla każdego okna dialogowego który jest otwarty:
import sys
import time
import ctypes
import ctypes.wintypes
EVENT_SYSTEM_DIALOGSTART = 0x0010
WINEVENT_OUTOFCONTEXT = 0x0000
user32 = ctypes.windll.user32
ole32 = ctypes.windll.ole32
ole32.CoInitialize(0)
WinEventProcType = ctypes.WINFUNCTYPE(
None,
ctypes.wintypes.HANDLE,
ctypes.wintypes.DWORD,
ctypes.wintypes.HWND,
ctypes.wintypes.LONG,
ctypes.wintypes.LONG,
ctypes.wintypes.DWORD,
ctypes.wintypes.DWORD
)
def callback(hWinEventHook, event, hwnd, idObject, idChild, dwEventThread, dwmsEventTime):
length = user32.GetWindowTextLengthA(hwnd)
buff = ctypes.create_string_buffer(length + 1)
user32.GetWindowTextA(hwnd, buff, length + 1)
print buff.value
WinEventProc = WinEventProcType(callback)
user32.SetWinEventHook.restype = ctypes.wintypes.HANDLE
hook = user32.SetWinEventHook(
EVENT_SYSTEM_DIALOGSTART,
EVENT_SYSTEM_DIALOGSTART,
0,
WinEventProc,
0,
0,
WINEVENT_OUTOFCONTEXT
)
if hook == 0:
print 'SetWinEventHook failed'
sys.exit(1)
msg = ctypes.wintypes.MSG()
while user32.GetMessageW(ctypes.byref(msg), 0, 0, 0) != 0:
user32.TranslateMessageW(msg)
user32.DispatchMessageW(msg)
user32.UnhookWinEvent(hook)
ole32.CoUninitialize()
fajne i czyste! Dziękuję! Ostatnie pytanie: co się stanie, jeśli nie będę? UnhookWinEvent' (na przykład moje awarie aplikacji lub coś podobnego) – kissgyorgy
System wyczyści to za Ciebie .Jeśli potrzebujesz haka do aktywności przez cały czas trwania procesu, nie musisz zawracać sobie głowy wywołaniem "UnhookWinEvent" lub "CoUninitialize". –
Dziękuję bardzo! Bardzo satysfakcjonująca odpowiedź! – kissgyorgy
- 1. Jak korzystać z funkcji Winapi w java?
- 2. Jak korzystać z gexiv2 w python?
- 3. Jak korzystać z LibreOffice Calc i Python?
- 4. Jak korzystać z flake8 dla Python 3?
- 5. Hardwarebreakpoint WINAPI
- 6. Python 3.3.4: python-daemon-3K; Jak korzystać z Runnera
- 7. Jak korzystać sys.exit() to Python
- 8. Jak "wyczyścić" przezroczyste okno WinAPI
- 9. Jak korzystać podproces POPEN Python
- 10. Jak korzystać z notacji kropek dla dict w python?
- 11. Jak korzystać z numpy w silniku aplikacji Google (Python)
- 12. Jak korzystać z compile_commands.json z powiązaniami python clang?
- 13. Jak korzystać z libxml2 z python na osxie lwa?
- 14. Czy Winapi obsługuje globalnie?
- 15. jak korzystać z gniazdka pobierania strony internetowej python
- 16. Jak korzystać z memory_profiler (moduł python) metodami klasy?
- 17. Maksymalne i minimalne rozmiary okien w WINAPI
- 18. Jak korzystać z funkcji "group_by_window" w TensorFlow
- 19. Prowadzenie procesu z najniższych możliwych przywilejów w WinAPI
- 20. Jak korzystać z PyPy w systemie Windows?
- 21. Obsługa WinAPI i UTF-8
- 22. TimeZoneInfo w WinApi zwraca nieprawidłową wartość
- 23. Czy istnieje metoda blokowania hosta w WINAPI?
- 24. Jak korzystać z SharedPreferences
- 25. Jak korzystać z tekstu?
- 26. Jak korzystać z AVAssetWriter?
- 27. Jak korzystać z dirs.proj?
- 28. Jak korzystać z QTextBlock?
- 29. Jak korzystać z find_module?
- 30. Jak korzystać z Resources.getFraction()?
Można wybrać [pyHook] (http://sourceforge.net/apps/mediawiki/ pyhook/index.php? title = Main_Page) użyteczne narzędzie Python. – martineau
jest to użyteczne tylko dla zdarzeń myszy i klawiatury, a główna logika jest ukryta w pliku .pyd :( – kissgyorgy
PyHook jest open-source, więc możesz spojrzeć na przykładowy kod źródłowy. pyconsole] (http://code.google.com/p/pyconsole/source/browse/trunk/pyconsole.py?r=5) możesz również obejrzeć, po prostu użyj [Google] (https://www.google .com/search? hl = en & as_q = python & as_epq = SetWinEventHook & as_oq = & as_eq = & as_nlo = & as_nhi = & lr = & cr = & as_qdr = all & as_sitesearch = & as_occt = any & safe = images & tbs = & as_filetype = & as_rights =). Jeśli nie piszesz lub nie używasz modułu rozszerzenia C, "prawdopodobnie będzie potrzebować poznać i używać kilku wbudowanych modułów' win32xxx' i 'ctypes.windll.user32'. – martineau