【发布时间】:2021-07-09 22:52:29
【问题描述】:
我正在寻找覆盖 Outlook 警告的解决方案:
我想要的是通过在单独的线程中对窗口弹出窗口进行操作(窗口暂停主线程)来允许访问 api 10 分钟。 请注意,与赎回库、更新信任中心设置或注册表相关的解决方法不适用于我的工作环境。
此时的代码检测到窗口,从下拉菜单中选择“10 分钟”选项,但未能将焦点设置为“允许”按钮并最终单击它。
class OutlookAccess_Watcher(QRunnable):
def __init__(self):
super().__init__()
def run(self):
while True:
if win32gui.FindWindowEx(win32gui.FindWindow(None, "Microsoft Outlook"), 0, "Static", "DAL=on"):
window = win32gui.FindWindow(None, "Microsoft Outlook")
combo_btn = win32gui.FindWindowEx(window, 0, "Button", "&Allow access for")
if win32gui.SendMessage(combo_btn, BM_GETCHECK, 0, 0):
combo_box = get_combobox_id(objects_window_finder(window))
win32gui.SendMessage(combo_box, win32con.CB_SETCURSEL, 3, 0)
allow_btn = win32gui.FindWindowEx(window, 0, "Button", "Allow")
win32gui.SendMessage(allow_btn, BM_CLICK, 0, 0)
break
else:
win32gui.SendMessage(combo_btn, BM_CLICK, 0, 0)
else:
time.sleep(1)
def run():
base = olBase() # class carrying the outlook app object obtained by win32com.client.gencache.EnsureDispatch("Outlook.Application")
mail = base.get_items()[0] # -> list of original mails objects (COM)
threadpool = QThreadPool()
threadpool.start(OutlookAccess_Watcher())
try:
body = mail.Body # warning appears and stops main thread here
except:
pass
print(body)
if __name__ == '__main__':
run()
感谢大家的支持。我设法通过在按钮上执行单击(鼠标事件)来实现我的目标。更新下面的代码,以防将来有人遇到这个问题。
class OutlookAccess_Watcher(QRunnable):
def __init__(self):
super().__init__()
def run(self):
while True:
if win32gui.FindWindowEx(win32gui.FindWindow(None, "Microsoft Outlook"), 0, "Static", "DAL=on"):
window = win32gui.FindWindow(None, "Microsoft Outlook")
combo_btn = win32gui.FindWindowEx(window, 0, "Button", "&Allow access for")
if win32gui.SendMessage(combo_btn, BM_GETCHECK, 0, 0):
combo_box = get_combobox_id(objects_window_finder(window))
win32gui.SendMessage(combo_box, win32con.CB_SETCURSEL, 3, 0)
allow_btn = win32gui.FindWindowEx(window, 0, "Button", "Allow")
windll.user32.BlockInput(True) # blocking user
mouse_X, mouse_Y = win32gui.GetCursorPos() # getting cursor original postion
allow_X, allow_Y,_,_ = win32gui.GetWindowRect(allow_btn) # getting posotion of Allow button
win32api.SetCursorPos((allow_X,allow_Y)) # moving cursor to Allow button location
# performing click
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,
allow_X,allow_Y,0,0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,
allow_X,allow_Y,0,0)
win32api.SetCursorPos((mouse_X, mouse_Y)) # restoring original position
windll.user32.BlockInput(False) # unblocking user
break
else:
win32gui.SendMessage(combo_btn, BM_CLICK, 0, 0)
else:
time.sleep(1)
【问题讨论】:
-
你可能只想使用 pyautogui。
-
正如其他人提到的,您可以使用 pyautogui 并将鼠标位置设置为按钮所在的位置,然后使其按下鼠标按钮
-
感谢您的快速回复。不幸的是,我将无法使用 pyautogui。我有一个固定的软件包列表,可以分发给我办公室的用户。对于使用 win32gui 的任何建议,我将不胜感激。
标签: python outlook threadpool win32com win32gui