Как имитировать щелчок мышью при удерживании клавиши SHIFT в Windows?

Здравствуйте, я пытаюсь имитировать щелчок мышью, удерживая клавишу SHIFT. Я пытался сделать это с помощью модуля pynput.

Это мой код на данный момент:

from pynput.keyboard import Key
from pynput.keyboard import Controller as Cont
from pynput.mouse import Button, Controller
import time

mouse = Controller()
keyboard = Cont()

with keyboard.pressed(Key.shift):
    mouse.position = (1892, 838)
    mouse.click(Button.left)

Я знаю, что код для удержания клавиши Shift работает (если я попытаюсь нажать кнопку «a» в коде, я увижу «A»). Также я знаю, что щелчок мышью работает. Однако вместе это не работает.


Также я попробовал другой код из сообщения StackOverflow: Pyautogui - нужно удерживать shift и щелкнуть

Я попробовал следующий код:

import pyautogui

pyautogui.keyDown('shift')
pyautogui.click()
pyautogui.keyUp('shift')

Это работало в течение минуты, затем перестало работать! Очень странный. Он терпит неудачу 9 раз из 10.


person jxpython    schedule 06.06.2019    source источник
comment
Попробуйте mouse.press(Button.left), а затем mouse.release(Button.left). Только предположение, основанное на том, как обычно работают события Windows.   -  person Blorgbeard    schedule 06.06.2019
comment
Уже пробовал. Это не работает. Спасибо, что подумали вместе со мной!   -  person jxpython    schedule 06.06.2019
comment
@Blorgbeard да   -  person jxpython    schedule 06.06.2019
comment
То работает, то не работает. Это срабатывает время от времени.   -  person jxpython    schedule 09.06.2019
comment
Хм, похоже, у меня работает. Как это проверить?   -  person CristiFati    schedule 09.06.2019
comment
@finefoot, я последовал вашему совету и поместил time.sleep (10) между двумя строками. Это не устранило проблему   -  person jxpython    schedule 09.06.2019
comment
@CristiFati Я запускаю свои скрипты Python для возвышенного текста 3. Или вы имели в виду что-то еще?   -  person jxpython    schedule 09.06.2019
comment
@finefoot, я собираюсь изучить это. У меня такое чувство, что ты мог бы быть прав   -  person jxpython    schedule 10.06.2019
comment
@finefoot, ты был прав. Цель была проблемой. Как-то это работает, только если я нажимаю на цель перед тем, как начать использовать Shift + щелчок. Я не думал, что это нужно. Но, похоже, так оно и есть. Если вы ответите, я приму его. Я чувствую, что вы этого заслуживаете, поскольку помогли решить мою проблему!   -  person jxpython    schedule 10.06.2019
comment
Кажется, этому вопросу не хватает деталей, потому что он работает в окружении всех остальных. Он на 100% работает и в моей среде, это связано с тем, что основное внимание уделялось не той цели, которая у вас есть, и тому приложению / браузеру, которое не распознает щелчок, не фокусируясь на нем? Если да, то можете ли вы уточнить целевое окно?   -  person buræquete    schedule 14.06.2019
comment
Не могли бы вы выбрать правильный ответ в качестве решения? Вы можете запутать будущих людей, ищущих аналогичную проблему ... Текущий принятый снова не будет работать без фокуса ...   -  person buræquete    schedule 17.07.2019


Ответы (3)


Вам стоит добавить к нему таймер, скорее всего, он сработает.

import pyautogui
import time

#cordinates
cordinates = 100,100
pyautogui.keyDown('shift')
time.sleep(0.15)
pyautogui.click(cordinates)
time.sleep(0.15)
pyautogui.keyUp('shift')
person Kazi Abu Jafor Jaber    schedule 23.06.2019

Скрипт работает так, как задумано, но кажется, что цель, к которой вы пытаетесь применить Shift + Left-Click, не принимает такие входные данные, пока его окно в графическом интерфейсе Windows не в фокусе. Вот почему это работает, когда вы включаете Left-Click перед Shift + Left-Click, потому что этот первый щелчок помещает целевое окно ( независимо от программы / приложения) в фокусе, то уже работающий, но игнорируемый Shift + Left-Click также принимается целью

person buræquete    schedule 14.06.2019

Обходной путь, который я предлагаю, - это создание такого слушателя событий:

from pynput.keyboard import Key, Listener

def on_press(key):
    print('{0} pressed'.format(
        key))

def on_release(key):
    print('{0} release'.format(
        key))
    if key == Key.esc:
        # Stop listener
        return False

enter code hereCollect events until released
with Listener(
        on_press=on_press,
        on_release=on_release) as listener:
    listener.join()
person Azer Gorai    schedule 06.06.2019
comment
OP хочет отправить ввод, а не получить его. - person Blorgbeard; 06.06.2019
comment
По моему скромному мнению, проблема с кодом оператора заключается в том, что он не обнаруживает событие триггера, чтобы войти в цикл и отправить щелчок, надеюсь, теперь я ясно выразился. - person Azer Gorai; 06.06.2019