Search code examples
pythonwinapipyautoguiwin32gui

Python win32api cannot draw on Windows Paint Application


I want to write a code with similiar function as

# code from https://codeloop.org/python-automation-drawing-in-paint-application/
import pyautogui, time
  
time.sleep(2)
 
pyautogui.click()
distance = 200
 
while distance > 0:
    pyautogui.dragRel(distance, 0, duration=0.2) # move right
    distance = distance - 5
    pyautogui.dragRel(0, distance, duration=0.2) # move down
 
    pyautogui.dragRel(-distance, 0, duration=0.2) #move left
    distance = distance - 5
 
    pyautogui.dragRel(0, -distance, duration=0.2) #move up

which draws following images

enter image description here

PyautoGui is a great tool, but it requires the program to run foreground. Is there anyway to write a code with similar ability and runs in background? I have tried win32api,

import win32gui
hwndMain = win32gui.FindWindow(None, "Untittled - Paint")
win32gui.SendMessage(hwnd, win32con.WM_LBUTTONDOWN, 1, make_long(500, 500))
win32gui.SendMessage(hwnd, win32con.WM_MOUSEMOVE, 1, make_long(000, 400))
win32gui.SendMessage(hwnd, win32con.WM_LBUTTONUP, 1, make_long(900, 900)) 

but it draws nothing in the Paint app.


Solution

  • If you want to send a drawing message, you should find the child window of MsPaint instead of sending it directly to MsPaint.

    Here is a sample and you can refer to it:

    import win32gui
    import win32con
    import win32api
    def findMSPaintDrawWindow():
        res = win32gui.FindWindow(None, "Untitled - Paint");
        if(res != None):
            res = win32gui.FindWindowEx(res, None, "MSPaintView", None);
            if(res != None):
                res = win32gui.FindWindowEx(res, None, None, None)
        return res;
    
    
    hwndMain = findMSPaintDrawWindow()
    
    win32gui.SendMessage(hwndMain, win32con.WM_LBUTTONDOWN, 1, win32api.MAKELONG(500, 500))
    win32gui.SendMessage(hwndMain, win32con.WM_MOUSEMOVE, 1, win32api.MAKELONG(000, 400))
    win32gui.SendMessage(hwndMain, win32con.WM_LBUTTONUP, 1, win32api.MAKELONG(900, 900)) 
    

    And it works for me:

    enter image description here