尝试了以下代码:
import win32gui
import win32con
windowID = win32gui.FindWindow(None, "testing.pdf - Adobe Acrobat Pro DC")
#win32gui.SetForegroundWindow(windowID)
win32gui.SendMessage(windowID, win32con.WM_KEYDOWN, win32con.VK_NEXT, 0) #VK_NEXT is Page Down button上面的代码只有当我取消注释SetForegroundWindow行时才能工作.有没有办法在不让窗口聚焦的情况下发送击键?
当我的脚本在后台的窗口上执行任务时,我希望保持终端的焦点。(主要发送不同的击键,如ctrl+Tab、pgDn/pgUp等)
编辑-建议的问题没有回答我的问题,因为解决方案在那里带来目标窗口的焦点。我想把目标窗口保存在背景本身。
谢谢@Vasily,代码现在甚至可以使用PyWinAuto。)这是工作的最终代码:
import time
import pywinauto
app = pywinauto.Application(backend="win32").start(r"C:\Program Files (x86)\Adobe\Acrobat DC\Acrobat\Acrobat.exe")
time.sleep(10)
print('sleeping over')
Wizard = app['testing.pdf - Adobe Acrobat Pro DC']
while True:
Wizard.send_keystrokes("{VK_NEXT}")
time.sleep(1)我认为问题在于我使用的是type_keys方法,而不是send_keystrokes。此外,在win32和uia之间来回往返也帮助我找到了正确工作的方法。对于Acrobat,win32工作。
谢谢@Vasily您的出色帮助&您出色的Python库PyWinAuto!:)
发布于 2020-08-03 03:00:21
如果将窗口带到前台,它将处理所有键盘输入,并将键盘输入定向到具有焦点的控件。当窗口不在前台时,它的任何控件都没有活动焦点,发送到窗口的键不会自动发送到要接收输入的控件。
我使用Foxit阅读器,但同样适用于Acrobat或其他应用程序。我试过这个:
from time import sleep
import win32gui
import win32con
def callback(handle, param):
s = win32gui.GetClassName(handle)
try:
print(f'Sending key to {handle}, {s}')
win32gui.SendMessage(handle, win32con.WM_KEYDOWN, win32con.VK_NEXT, 0)
win32gui.SendMessage(handle, win32con.WM_KEYUP, win32con.VK_NEXT, 0)
sleep(2)
except Exception:
print('Exception sending to {handle}, {s}')
window_id = win32gui.FindWindow(None, "my_multipage_doc.pdf - Foxit Reader")
win32gui.EnumChildWindows(window_id, callback, 0)这产生了大量的输出,窗口中的每个对象都有一行,但这是一个相关的位:
...
Sending key to 594376, ScrollBar
Sending key to 1904808, ScrollBar
Sending key to 397704, ScrollBar
Sending key to 397598, AfxFrameOrView140su
Sending key to 397580, AfxWnd140su
Sending key to 397734, AfxWnd140su
Sending key to 1971214, AfxWnd140su
Sending key to 856494, FoxitDocWnd
Sending key to 986558, Static
...当一个VK_NEXT被发送到第一个Scrollbar时,就像它被发送到FoxitDocWnd时一样,查看器向下滚动一个页面。
所以,我改写如下:
import win32gui
import win32con
def send_page_down(handle, param):
if win32gui.GetClassName(handle) == param:
win32gui.SendMessage(handle, win32con.WM_KEYDOWN, win32con.VK_NEXT, 0)
win32gui.SendMessage(handle, win32con.WM_KEYUP, win32con.VK_NEXT, 0)
window_id = win32gui.FindWindow(None, "my_multipage_doc.pdf - Foxit Reader")
win32gui.EnumChildWindows(window_id, send_page_down, 'FoxitDocWnd')这能满足你的需要。
奇怪的是,我尝试过的其他东西却没有奏效:
import win32gui
import win32con
window_id = win32gui.FindWindow(None, "my_multipage_doc.pdf - Foxit Reader")
viewer_id = win32gui.FindWindowEx(window_id, 0, 'FoxitDocWnd', None)
win32gui.SendMessage(viewer_id , win32con.WM_KEYDOWN, win32con.VK_NEXT, 0)
win32gui.SendMessage(viewer_id , win32con.WM_KEYUP, win32con.VK_NEXT, 0)但是,当试图获得viewer_id时,这是失败的。因此,即使FoxitDocWnd在枚举所有子窗口时显示,它也无法显式地找到它。如果你能找到问题所在,那将是一个更好的解决方案。
https://stackoverflow.com/questions/63110628
复制相似问题