我正在寻找覆盖Outlook警告的解决方案:
我想要的是允许access通过在单独的线程中操作窗口弹出窗口(窗口挂起主线程)来执行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)
您似乎面临Outlook安全问题。如果您试图访问任何受保护的属性或方法,它也可以是Outlook发出的提示。您会收到安全提示/异常,因为Outlook是通过以下方式之一在客户端计算机上配置的:
如果系统上安装了任何最新的防病毒软件,您可以创建一个组策略,以防止显示安全提示,或者仅关闭这些警告(实际上不建议这样做)
在Security Behavior of the Outlook Object Model文章中阅读更多关于这方面的内容
您也可以考虑使用Outlook构建的低级代码,而不提供安全性问题——扩展MAPI。考虑在该API周围使用任何第三方包装,如Redemption。如果这不是一个选项,那么看看Outlook Security Manager组件,它允许在运行时动态抑制Outlook安全问题
相关问题 更多 >
编程相关推荐