2022年6月22日水曜日

Pywin32 ダイアログを前面に出したい

 前回までフォーマットを行いましたが、今度は、そのフォーマット上に、解データを書いていきます。問題は、書く時間ですが、色なしにすれば、2-3秒に改善出力が可能なことが分かりました。ところが、スケジュールナースⅢで定義したラベルの色付でだそうとすると、

色付:90秒

となりました。なので、次のようなダイアログを出して選択を促そうと思いました。


ところが、このダイアログが背面に隠れてしまって出てこないときがあります。(連続で出てくることもあったり、連続で背面に行くことがあったりします。)

こうなるとハングしたように思われるので致命的です。そこでダイアログを前面にする方法を検討しました。TKInterも検討しましたが、上手くいきませんでした。

python ctypes messagebox appears under all programs - Stack Overflow

ということで、スケジュールナースのWindowsHandleが得られれば上手く行きそうだということが分かりました。(Win32APIそのままです。)

Window Handleを得る方法は、

python - How to get a list of the name of every open window? - Stack Overflow

ということです。win32guiをインポート出来れば良いのですが、幸いなことにPywin32に含まれていました。

で、次のコードでダイアログを前面に出すことができました。EnumWindowsは値を返せないので、やむを得ずglobalを使用しました。



import win32com.client
import win32gui
import ctypes



MB_TOPMOST=0x00040000
MB_YESNOCANCEL=0x00000003
def winEnumHandler( hwnd, ctx ):
    if win32gui.IsWindowVisible( hwnd ):
        text=win32gui.GetWindowText( hwnd )
        print (hex(hwnd),text )
        if 'スケジュールナース' in text or "Schedule Nurse" in text:
            global sc3_hwnd
            sc3_hwnd=hex(hwnd)
            print("Detected",sc3_hwnd)
sc3_hwnd=0
win32gui.EnumWindows( winEnumHandler, None )
MessageBox = ctypes.windll.user32.MessageBoxW
hwnd=int(int(sc3_hwnd,0))
print("hwnd=",hwnd)
#res=MessageBox(0, '本当に色付き出力にしますか?色付きにするとすごく時間がかかります。', '色付き出力選択',MB_TOPMOST|MB_YESNOCANCEL)
res=MessageBox(hwnd, '本当に色付き出力にしますか?色付きにするとすごく時間がかかります。', '色付き出力選択',MB_TOPMOST|MB_YESNOCANCEL)
        

print("sc3_hwnd",sc3_hwnd)

0 件のコメント:

コメントを投稿