EnumWindows の列挙を止める際に EnumWindowsProc(コールバック関数)に 0 を返すとエラーが発生します。
エラーを発生させずに列挙を止める方法についてご教示お願いいたします。
言語:Python3.7
実行環境:Windows10 64bit / Visual Studio 2019
Python
1import win32gui 2 3def EnumWindowsProc(hWnd, lParam): 4 if lParam == 0: 5 return 0 6 7win32gui.EnumWindows(EnumWindowsProc, 0)
エラー箇所
win32gui.EnumWindows(EnumWindowsProc, 0)
エラー内容
Message=(126, 'EnumWindows', '指定されたモジュールが見つかりません。')
Source=C:\Users\sample.py
スタック トレース:
File "C:\Users\sample.py", line 9, in <module>
win32gui.EnumWindows(EnumWindowsProc, 0)
上記プログラムについて
御覧の通りですが、トップレベルウィンドウの列挙を行い、
最初の1回目で列挙を終了させています。
本来は該当の pid を持つ場合に列挙を終了させますが、
本件のエラーが EnumWindowsProc の return False に起因することが判明している為、
極力簡潔に事象を再現できる様、上記プログラムを掲載しました。
試したこと
- EnumWindowsProc の return False を削除する。
エラーは発生しませんが、列挙を止めることができません。
0. EnumWindowsProc で SetLastError を実行する。
EnumWindows の Docs を確認した所、
EnumWindowsProc が 0 を返すと列挙を終了するが、
その場合は EnumWindowsProc が EnumWindows の呼び出し元に SetLastError で
意味のあるエラー番号を返す必要があると記載がありました。
なので、EnumWindowsProc で return 0 の直前に SetLastError を呼び出して、
有効な(エラー内容が紐付けられた)エラー番号を渡してみました。
結果、上記で発生しているエラー番号 126 が SetLastError で指定したエラー番号に変化しました。
またエラー内容も該当のエラー番号に合わせて変化します。
この場合もエラー自体は発生している為、処理が止まってしまいます。
複数種類のエラーを試行したものの、いずれの種類のエラーでも同様にエラー自体は発生しました。
また、有効でないエラー(-1 や 0 など)の場合もエラーは発生します。
その場合、エラー内容は「エラー番号が定義されていない」といったものになります。
そもそも他言語で EnumWindows を利用した際はこの様な処理をしなくとも正常に動作しておりましたので、
SetLastError では本事象を解消できないのではないかと考えております。
0. EnumWindowsProc の戻り値を return 0 でなく return False にする。
Docs によると、EnumWindowsProc の戻り値は BOOL の様でしたので変更してみました。
結果は変化ありませんでした。
0. EnumWindows の戻り値を rc で受け取ってみる
Docs によると、EnumWindowsProc が 0 を返した場合、
EnumWindows 自体も 0 を返すらしく、
以下の様に、EnumWindows の呼び出し元に明示的にそれを受け取らせてみました。
```Python
rc = win32gui.EnumWindows(EnumWindowsProc, 0)
結果は変化ありませんでした。 ### 例外処理による回避策について 本事象の回避策として、例外処理をすれば問題なく処理を進められるかと思います。 しかし、今後も利用頻度は少なくないであろう API についてでしたので、 利用方法に落ち度があるのであれば、どう改善すべきか、 または、win32gui 配下で EnumWindows を利用する以上、エラーを発生させない方法はないのか、 など、例外処理以外の回避策の有無やその内容について確認したくご質問させて頂きました。 もし上記事象について何かご存じの方がいらっしゃいましたら、 ご回答頂けますと幸甚です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/07/01 13:41