имитировать ctrl + c событие в windows 10, используя python - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь смоделировать событие клавиатуры ctrl + c в python3, используя библиотеку pyautogui.К сожалению, библиотека не генерирует это событие.Есть ли другой способ сгенерировать это?

Следующий код не работает,

from pyautogui import hotkey

hotkey('ctrl', 'c')

Я хочу выполнить эту задачу для следующего кода.Код может записывать живое аудио в течение произвольной продолжительности, и запись можно остановить в любое время, нажав «Ctrl + c».Я хочу создать это событие, чтобы добавить некоторые дополнительные функции.

import os
import sys
import time
import queue
import soundfile as f
import sounddevice as sd

def callback(indata, frames, time, status):
            """
    This function is called for each audio block from the record function.
    """

    if status:
        print(status, file=sys.stderr)
    q.put(indata.copy())

def record(filename):

    try:
        # Make sure the file is open before recording begins
        with sf.SoundFile(filename, mode='x', samplerate=48000, channels=2, subtype="PCM_16") as file:
            with sd.InputStream(samplerate=48000, channels=2, callback=callback):
                print('START')
                print('#' * 80)
                """ 
                Here is the place I want to generate the event (Ctrl+c) 
                after n minutes
                """
                print('press Ctrl+c to stop the recording')
                while True:
                    file.write(q.get())
    except KeyboardInterrupt:
        print('The recording is over.')

if __name__ == "__main__":
    q = queue.Queue()
    record('filename.wav')

1 Ответ

0 голосов
/ 14 ноября 2018

Это всего лишь предложение, и оно может быть не очень хорошим, потому что я очень начинающий в питоне.

Используйте PyWin32 для вызова Windows API GenerateConsoleCtrlEvent(). Вы можете генерировать CTRL + C с помощью этого API, поэтому он может решить вашу проблему, если вы вызовете его с помощью PyWin32.

Обновление:

Вот мой первый код на Python. Вы можете использовать функцию send_ctrl_c для отправки CTRL-C другому процессу. Я проверил, и это работает.

import win32api as api
import win32console as con

# takes another process id as argument. method sleeps for 2 seconds 
def send_ctrl_c(pid) :
 con.FreeConsole()
 if con.AttachConsole(int(pid)) == None : 
  api.SetConsoleCtrlHandler(None, 1)
  api.GenerateConsoleCtrlEvent(con.CTRL_C_EVENT, 0)
  api.Sleep(2000)
  con.FreeConsole()
  api.SetConsoleCtrlHandler(None, 0)

Этот код написан на основе здесь и здесь .

...