使用 python 和 win32api 模拟鼠标点击
Simulating mouse click using python and win32api
我正在尝试模拟鼠标左键单击 window(Samsung Flow),但不幸的是它不起作用。当我尝试使用 google chrome window 时它可以工作,但我已经尝试过 Paint 和 Samsung Flow 但它不起作用。这是我的代码:
import win32api
import win32con
import time
import random
def enumHandler(hwnd, lParam):
if win32gui.IsWindowVisible(hwnd):
# if 'Stack Overflow' in win32gui.GetWindowText(hwnd):
if 'Samsung Flow' in win32gui.GetWindowText(hwnd):
print(win32gui.GetWindowText(hwnd))
for _ in range(50):
l_param = win32api.MAKELONG(random.randint(10, 500), random.randint(10, 500))
win32gui.PostMessage(hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, l_param)
time.sleep(0.1)
win32gui.PostMessage(hwnd, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, l_param)
time.sleep(0.1)
win32gui.EnumWindows(enumHandler, None)
我知道它会检测到 window,因为我正在打印检测到的文本,但我不知道为什么它只适用于 Chrome window。
更新
我试过下面的代码,搜索两个windows记事本和浏览器:
import win32gui
import win32api
import win32con
import time
def enumHandler(hwnd, lParam):
if win32gui.IsWindowVisible(hwnd):
# if 'Notepad' in win32gui.GetWindowText(hwnd):
if 'Stack Overflow' in win32gui.GetWindowText(hwnd):
print(win32gui.GetWindowText(hwnd))
win32gui.SetForegroundWindow(hwnd)
win32api.SendMessage(hwnd, win32con.WM_CHAR, ord("c"), 0)
time.sleep(0.1)
win32gui.EnumWindows(enumHandler, None)
结果是:
- 在浏览器上使用时(搜索 Stack Overflow window),window 出现在前台并打印字母 c
- 当使用记事本时,window 出现在前台,但字母没有打印出来!我不知道为什么。
嗯,我找到问题了。
在尝试将字母 C 发送到记事本和 chrome 浏览器的示例中,我假设第一个 hwnd 是正确的,但在某些情况下,您必须与 child 进行交互window。一个 window 可能有多个 child window,因此,我将 post 此处提供一个代码,您可以在其中找到要与之交互的 window。
import win32gui
import win32con
import win32api
import time
def send_char(hwnd, lparam):
s = win32gui.GetWindowText(hwnd)
print("child_hwnd: %d txt: %s" % (hwnd, s))
win32api.PostMessage(hwnd, win32con.WM_CHAR, ord('c'), 0)
time.sleep(5)
return 1
def main():
main_app = 'Untitled - Notepad'
hwnd = win32gui.FindWindow(None, main_app)
if hwnd:
win32gui.EnumChildWindows(hwnd, send_char, None)
main()
有了它你可以找到你应该发送消息的 child window (代码打印 window id 和名称,发送字符并等待 5 秒,因此,当您注意到 window 上的字符时,只需获取最后打印的 window id 并使用它代替 parent window).
希望对遇到同样问题的人有所帮助。
我正在尝试模拟鼠标左键单击 window(Samsung Flow),但不幸的是它不起作用。当我尝试使用 google chrome window 时它可以工作,但我已经尝试过 Paint 和 Samsung Flow 但它不起作用。这是我的代码:
import win32api
import win32con
import time
import random
def enumHandler(hwnd, lParam):
if win32gui.IsWindowVisible(hwnd):
# if 'Stack Overflow' in win32gui.GetWindowText(hwnd):
if 'Samsung Flow' in win32gui.GetWindowText(hwnd):
print(win32gui.GetWindowText(hwnd))
for _ in range(50):
l_param = win32api.MAKELONG(random.randint(10, 500), random.randint(10, 500))
win32gui.PostMessage(hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, l_param)
time.sleep(0.1)
win32gui.PostMessage(hwnd, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, l_param)
time.sleep(0.1)
win32gui.EnumWindows(enumHandler, None)
我知道它会检测到 window,因为我正在打印检测到的文本,但我不知道为什么它只适用于 Chrome window。
更新
我试过下面的代码,搜索两个windows记事本和浏览器:
import win32gui
import win32api
import win32con
import time
def enumHandler(hwnd, lParam):
if win32gui.IsWindowVisible(hwnd):
# if 'Notepad' in win32gui.GetWindowText(hwnd):
if 'Stack Overflow' in win32gui.GetWindowText(hwnd):
print(win32gui.GetWindowText(hwnd))
win32gui.SetForegroundWindow(hwnd)
win32api.SendMessage(hwnd, win32con.WM_CHAR, ord("c"), 0)
time.sleep(0.1)
win32gui.EnumWindows(enumHandler, None)
结果是:
- 在浏览器上使用时(搜索 Stack Overflow window),window 出现在前台并打印字母 c
- 当使用记事本时,window 出现在前台,但字母没有打印出来!我不知道为什么。
嗯,我找到问题了。
在尝试将字母 C 发送到记事本和 chrome 浏览器的示例中,我假设第一个 hwnd 是正确的,但在某些情况下,您必须与 child 进行交互window。一个 window 可能有多个 child window,因此,我将 post 此处提供一个代码,您可以在其中找到要与之交互的 window。
import win32gui
import win32con
import win32api
import time
def send_char(hwnd, lparam):
s = win32gui.GetWindowText(hwnd)
print("child_hwnd: %d txt: %s" % (hwnd, s))
win32api.PostMessage(hwnd, win32con.WM_CHAR, ord('c'), 0)
time.sleep(5)
return 1
def main():
main_app = 'Untitled - Notepad'
hwnd = win32gui.FindWindow(None, main_app)
if hwnd:
win32gui.EnumChildWindows(hwnd, send_char, None)
main()
有了它你可以找到你应该发送消息的 child window (代码打印 window id 和名称,发送字符并等待 5 秒,因此,当您注意到 window 上的字符时,只需获取最后打印的 window id 并使用它代替 parent window).
希望对遇到同样问题的人有所帮助。