@deac4545

Как через Python вставить текст?

Можно ли Python вставлять текст или нет? Просто нужно вставить текст в блокнот, но почитав оказалось что пайтон не может вставлять текст. Это так?
  • Вопрос задан
  • 287 просмотров
Решения вопроса 1
@DenisShahbazyan
Вот так можно вставить текст в окно блокнота.
Используется только одна внешняя библиотека "pip install pypiwin32" - для ее установки. (После установки перезапусти IDE)

import time
import ctypes
import win32con
from ctypes import wintypes as w


KEYEVENTF_SCANCODE = 0x8
KEYEVENTF_UNICODE = 0x4
KEYEVENTF_KEYUP = 0x2
SPACE = 0x39
INPUT_KEYBOARD = 1

# not defined by wintypes
ULONG_PTR = ctypes.c_ulong if ctypes.sizeof(
    ctypes.c_void_p) == 4 else ctypes.c_ulonglong


class KEYBDINPUT(ctypes.Structure):
    _fields_ = [('wVk', w.WORD),
                ('wScan', w.WORD),
                ('dwFlags', w.DWORD),
                ('time', w.DWORD),
                ('dwExtraInfo', ULONG_PTR)]


class MOUSEINPUT(ctypes.Structure):
    _fields_ = [('dx', w.LONG),
                ('dy', w.LONG),
                ('mouseData', w.DWORD),
                ('dwFlags', w.DWORD),
                ('time', w.DWORD),
                ('dwExtraInfo', ULONG_PTR)]


class HARDWAREINPUT(ctypes.Structure):
    _fields_ = [('uMsg', w.DWORD),
                ('wParamL', w.WORD),
                ('wParamH', w.WORD)]


class DUMMYUNIONNAME(ctypes.Union):
    _fields_ = [('mi', MOUSEINPUT),
                ('ki', KEYBDINPUT),
                ('hi', HARDWAREINPUT)]


class INPUT(ctypes.Structure):
    _anonymous_ = ['u']
    _fields_ = [('type', w.DWORD),
                ('u', DUMMYUNIONNAME)]


lib = ctypes.WinDLL('user32')
lib.SendInput.argtypes = w.UINT, ctypes.POINTER(INPUT), ctypes.c_int
lib.SendInput.restype = w.UINT


def send_scancode(code):
    i = INPUT()
    i.type = INPUT_KEYBOARD
    i.ki = KEYBDINPUT(0, code, KEYEVENTF_SCANCODE, 0, 0)
    lib.SendInput(1, ctypes.byref(i), ctypes.sizeof(INPUT))
    i.ki.dwFlags |= KEYEVENTF_KEYUP
    lib.SendInput(1, ctypes.byref(i), ctypes.sizeof(INPUT))


def send_unicode(s):
    i = INPUT()
    i.type = INPUT_KEYBOARD
    for c in s:
        i.ki = KEYBDINPUT(0, ord(c), KEYEVENTF_UNICODE, 0, 0)
        lib.SendInput(1, ctypes.byref(i), ctypes.sizeof(INPUT))
        i.ki.dwFlags |= KEYEVENTF_KEYUP
        lib.SendInput(1, ctypes.byref(i), ctypes.sizeof(INPUT))


def find_notepad_window(notepad_title):
    while True:
        notepad_handle = ctypes.windll.user32.FindWindowW(None, notepad_title)
        if notepad_handle != 0:
            return notepad_handle
        time.sleep(1)


def insert_text_into_notepad(notepad_handle, text):
    # Развернуть окно, если оно свернуто
    ctypes.windll.user32.ShowWindow(notepad_handle, win32con.SW_RESTORE)
    # Сделать окно активным
    ctypes.windll.user32.SetForegroundWindow(notepad_handle)
    # Изменить заголовок окна
    # ctypes.windll.user32.SendMessageW(notepad_handle, win32con.WM_SETTEXT, 0, text)

    # send_scancode(SPACE)
    # Текст в блокнот
    send_unicode(text)


if __name__ == "__main__":
    notepad_title = "Безымянный – Блокнот"
    text_to_insert = "Привет, мир!"

    notepad_handle = find_notepad_window(notepad_title)
    insert_text_into_notepad(notepad_handle, text_to_insert)


Чтобы найти все окна в системе (все имена окон) запусти это
import ctypes


def enum_windows_callback(hwnd, lParam):
    window_title = ctypes.create_unicode_buffer(1024)
    ctypes.windll.user32.GetWindowTextW(hwnd, window_title, 1024)
    print(f"Window Handle: {hwnd}, Window Title: {window_title.value}")
    return True


ctypes.windll.user32.EnumWindows(ctypes.WINFUNCTYPE(
    ctypes.c_bool, ctypes.c_ulong, ctypes.c_ulong)(enum_windows_callback), 0)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
lxstvayne
@lxstvayne
Люблю Python
В Python можно вставлять текст!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
01 мая 2024, в 02:11
5000 руб./за проект
01 мая 2024, в 00:29
2000 руб./за проект
01 мая 2024, в 00:20
15000 руб./за проект