繁体   English   中英

使用python和win32api模拟鼠标点击

[英]Simulating mouse click using python and win32api

我正在尝试模拟鼠标左键单击窗口(Samsung Flow),但不幸的是它不起作用。 当我尝试使用 google chrome 窗口时,它可以工作,但我已经尝试过 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)

我知道它会在我打印检测到的文本时检测到窗口,但我不知道为什么它只适用于 Chrome 窗口。

更新

我尝试了以下代码,以搜索两个 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 窗口),窗口来到前台并打印字母 c
  • 使用记事本时,窗口出现在前台,但字母没有打印出来! 我不知道为什么。

嗯,我发现了问题。

在尝试将字母 C 发送到记事本和 chrome 浏览器的示例中,我假设第一个 hwnd 是正确的,但在某些情况下,您必须与子窗口进行交互。 一个窗口可能有多个子窗口,因此,我将在此处发布代码,您可以在其中找到要与之交互的窗口。

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()

有了它,您可以找到应该将消息发送到的子窗口(代码打印窗口 id 和名称,发送字符并等待 5 秒,因此当您注意到窗口上的字符时,只需获取最后打印的窗口 id 和使用它而不是父窗口)。

我希望它可以帮助面临同样问题的人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM