পাইথনে কীওয়ার্ড ইভেন্টগুলি কীভাবে উত্পন্ন করা যায়?


97

সংক্ষিপ্ত সারাংশ:

আমি এমন একটি প্রোগ্রাম তৈরি করার চেষ্টা করছি যা কম্পিউটারে কীবোর্ড ইভেন্টগুলি প্রেরণ করবে যে সমস্ত উদ্দেশ্যে সিমুলেটেড ইভেন্টগুলি কীবোর্ডের আসল কীস্ট্রোক হিসাবে বিবেচনা করা উচিত।

মূল পোস্ট:

আমি পাইথন ব্যবহার করে কীবোর্ডের ইভেন্টগুলি উত্পন্ন করার উপায় খুঁজছি।

ধরে নিন যে ফাংশনটি এমন একটি কী পেয়েছে যা এটির মতো চাপের অনুকরণ করতে হবে:

keyboardevent('a') #lower case 'a'
keyboardevent('B') #upper case 'B'
keyboardevent('->') # right arrow key

def keyboardevent(key):
    #code that simulated 'key' being pressed on keyboard

উপরেরটি অবশ্যই স্পষ্টভাবে উদাহরণস্বরূপ, তবে আমি যা খুঁজছি তা হল একটি লাইব্রেরি, মডিউল বা যা কিছু, যা আমি কীবোর্ড ইভেন্টগুলি অনুকরণ করতে ব্যবহার করতে পারি।

দ্রষ্টব্য : এটি নোটপ্যাডগুলিতে অক্ষর প্রেরণ, বা ক্ষেত্র বা এ জাতীয় ক্ষেত্রে পাঠ্য ইনপুট করার চেয়ে আলাদা। আমি পাইথন স্ক্রিপ্টটি একটি আসল কীবোর্ড ইভেন্টটি অনুকরণ করতে চাই, কম্পিউটারটি ভাববে যে সত্যিই একটি কীবোর্ড ইভেন্ট আছে।

অতিরিক্ত নোট:

আমি সক্রিয় উইন্ডোতে কীস্ট্রোক প্রেরণ করতে চাই না - আমি চাই সিস্টেমটি কীবোর্ডের কীগুলি টিপছে, সূক্ষ্ম পার্থক্যটি বিশ্বাস করবে, কারণ কিছু সক্রিয় উইন্ডো নির্দিষ্ট কী-সংমিশ্রণগুলি গ্রহণ করে না, বা যদি আমি কীবোর্ড শর্টকাট ব্যবহার করতে চাইতাম আমার স্ক্রিপ্টের মাধ্যমে পটভূমি প্রক্রিয়াগুলির জন্য, তাদের সক্রিয় উইন্ডো দিয়ে যাওয়ার দরকার নেই

এখন পর্যন্ত আমি এই জিনিসগুলি তাকিয়েছি:

সামনেরতম অ্যাপ্লিকেশনটির জন্য কীবোর্ড ইভেন্টগুলি তৈরি করুন

পাইথনের মাধ্যমে কী-বোর্ড কীপ্রেস ইভেন্টগুলি কীভাবে উত্পন্ন করা যায়?

যা অ্যাপল সম্পর্কে ছিল এবং এগুলি কোনও উপকারে আসেনি।

এবং এই:

পাইথনে কীবোর্ড এবং মাউস অনুকরণ করার সহজতম উপায় কোনটি?

যা মনে হচ্ছে এটি আমার যা প্রয়োজন তা হতে পারে তবে আমি এটির জন্য কোনও লাইব্রেরি বা কোনও ডকুমেন্টেশন খুঁজে পাই না।

আমি আরও জায়গাগুলিও অনুসন্ধান করেছি তবে এখনও এর সমাধান খুঁজে পাইনি।


4
আমি কেবলমাত্র সেন্ডকিইস সম্পর্কে জানি যা কেবল উইন্ডোজ। এটি এমন একটি সমস্যার মতো মনে হচ্ছে যার কোনও ক্রস প্ল্যাটফর্ম সমাধান হবে না। আপনার এটার দরকার কেন? কোন সমস্যার সমাধান করছেন?
স্টিভেন রাম্বালস্কি

জন্য Xপ্ল্যাটফর্মের আছে xdotoolকিন্তু সাধারণত ডিফল্ট অনুসারে ইনস্টল করা নেই। আমি বিশ্বাস করি যে এর জন্য ডকস পড়ার পক্ষে সিটিতে Xএকটি ন্যূনতম মডিউল লেখা শক্ত হওয়া উচিত নয় যা আপনি যা চান তা করেন (আমি বিশ্বাস করি xsendkeysকিছুক্ষণ আগে একটি প্রোগ্রাম ছিল )।
বাকুরিউ

@ স্টিভেন রুমালস্কি আপনাকে ধন্যবাদ, এটি আশাব্যঞ্জক মনে হলেও আমি যুক্ত করতে চাই, আমি আমার প্রশ্নটি সম্পাদনা করব। আমি সক্রিয় উইন্ডোতে কীস্ট্রোকগুলি প্রেরণ করতে চাই না - আমি চাই সিস্টেমটি কীবোর্ড কীগুলি টিপছে, সূক্ষ্ম পার্থক্য বিশ্বাস করতে পারে, কারণ কিছু সক্রিয় উইন্ডো নির্দিষ্ট কী-সংমিশ্রণগুলি গ্রহণ করে না, বা যদি আমি ব্যাকগ্রাউন্ড প্রক্রিয়াগুলির জন্য কীবোর্ড শর্টকাট ব্যবহার করতে চাইতাম আমার স্ক্রিপ্টের মাধ্যমে তাদের সক্রিয় উইন্ডো দিয়ে যাওয়ার দরকার নেই।
ইনবার রোজ

4
এটি কি খাঁটি অজগর হতে হবে? এটি কি ক্রস প্ল্যাটফর্ম হতে হবে?
zenpoy

@ জেনপয় আপাতত, এটি ক্রস প্ল্যাটফর্ম হওয়ার দরকার নেই, যতক্ষণ না এটি উইন্ডোজ এক্সপি এবং 7 এর জন্য কমপক্ষে .. অজগর হিসাবে কাজ করবে। কোডটি অজগরে লেখা হতে চলেছে। যদি মডিউল / গ্রন্থাগার / প্যাকেজ / dll অজগর থেকে কার্যকরভাবে ইন্টারফেস করা যায় তবে তাতে কিছু আসে যায় না। আদর্শভাবে, এটি খাঁটি অজগর এবং ক্রস প্ল্যাটফর্ম।
ইনবার রোজ

উত্তর:


113

এটি টাইপগুলি ব্যবহার করে করা যেতে পারে:

import ctypes
from ctypes import wintypes
import time

user32 = ctypes.WinDLL('user32', use_last_error=True)

INPUT_MOUSE    = 0
INPUT_KEYBOARD = 1
INPUT_HARDWARE = 2

KEYEVENTF_EXTENDEDKEY = 0x0001
KEYEVENTF_KEYUP       = 0x0002
KEYEVENTF_UNICODE     = 0x0004
KEYEVENTF_SCANCODE    = 0x0008

MAPVK_VK_TO_VSC = 0

# msdn.microsoft.com/en-us/library/dd375731
VK_TAB  = 0x09
VK_MENU = 0x12

# C struct definitions

wintypes.ULONG_PTR = wintypes.WPARAM

class MOUSEINPUT(ctypes.Structure):
    _fields_ = (("dx",          wintypes.LONG),
                ("dy",          wintypes.LONG),
                ("mouseData",   wintypes.DWORD),
                ("dwFlags",     wintypes.DWORD),
                ("time",        wintypes.DWORD),
                ("dwExtraInfo", wintypes.ULONG_PTR))

class KEYBDINPUT(ctypes.Structure):
    _fields_ = (("wVk",         wintypes.WORD),
                ("wScan",       wintypes.WORD),
                ("dwFlags",     wintypes.DWORD),
                ("time",        wintypes.DWORD),
                ("dwExtraInfo", wintypes.ULONG_PTR))

    def __init__(self, *args, **kwds):
        super(KEYBDINPUT, self).__init__(*args, **kwds)
        # some programs use the scan code even if KEYEVENTF_SCANCODE
        # isn't set in dwFflags, so attempt to map the correct code.
        if not self.dwFlags & KEYEVENTF_UNICODE:
            self.wScan = user32.MapVirtualKeyExW(self.wVk,
                                                 MAPVK_VK_TO_VSC, 0)

class HARDWAREINPUT(ctypes.Structure):
    _fields_ = (("uMsg",    wintypes.DWORD),
                ("wParamL", wintypes.WORD),
                ("wParamH", wintypes.WORD))

class INPUT(ctypes.Structure):
    class _INPUT(ctypes.Union):
        _fields_ = (("ki", KEYBDINPUT),
                    ("mi", MOUSEINPUT),
                    ("hi", HARDWAREINPUT))
    _anonymous_ = ("_input",)
    _fields_ = (("type",   wintypes.DWORD),
                ("_input", _INPUT))

LPINPUT = ctypes.POINTER(INPUT)

def _check_count(result, func, args):
    if result == 0:
        raise ctypes.WinError(ctypes.get_last_error())
    return args

user32.SendInput.errcheck = _check_count
user32.SendInput.argtypes = (wintypes.UINT, # nInputs
                             LPINPUT,       # pInputs
                             ctypes.c_int)  # cbSize

# Functions

def PressKey(hexKeyCode):
    x = INPUT(type=INPUT_KEYBOARD,
              ki=KEYBDINPUT(wVk=hexKeyCode))
    user32.SendInput(1, ctypes.byref(x), ctypes.sizeof(x))

def ReleaseKey(hexKeyCode):
    x = INPUT(type=INPUT_KEYBOARD,
              ki=KEYBDINPUT(wVk=hexKeyCode,
                            dwFlags=KEYEVENTF_KEYUP))
    user32.SendInput(1, ctypes.byref(x), ctypes.sizeof(x))

def AltTab():
    """Press Alt+Tab and hold Alt key for 2 seconds
    in order to see the overlay.
    """
    PressKey(VK_MENU)   # Alt
    PressKey(VK_TAB)    # Tab
    ReleaseKey(VK_TAB)  # Tab~
    time.sleep(2)
    ReleaseKey(VK_MENU) # Alt~

if __name__ == "__main__":
    AltTab()

hexKeyCodeউইন্ডোজ এপিআই দ্বারা নির্ধারিত ভার্চুয়াল কীবোর্ড ম্যাপিং। কোডগুলির তালিকা এমএসডিএন - তে উপলব্ধ: ভার্চুয়াল- কোড কোডগুলি (উইন্ডোজ)


আমি এখন পর্যন্ত এই ধারণা পছন্দ করি। আমি ভিকে_কে'র একটি তালিকা খুঁজে পাচ্ছি না এবং আপনি একটি উদাহরণ ফাংশন কল করতে পারেন।
ইনবার রোজ

4
আমি Alt-tab হিট করার জন্য একটি সহজ পদ্ধতি পদ্ধতি যুক্ত করি।
lucasg

আমি এটি আশ্চর্যজনকভাবে ব্যবহার করে আসছি, তবে এখন আমার একটি ছোট সমস্যা রয়েছে, আশা করি আপনি আমাকে সহায়তা করতে পারেন - আমি কীভাবে মাউস এক্স, ওয়াইকে স্থানান্তর করতে পারি?
ইনবার রোজ

15
ডুপ্লিকেট প্রশ্নের পাশে সময় বিন্দু পরিবর্তে উত্তর অনুরূপ সংখ্যা: stackoverflow.com/questions/13289777/...
Nakilon

8
এটি দেখতে উইন্ডোজ নির্দিষ্ট। লিনাক্সের বিকল্প উপায় কী?
পাগল কোডার

84

পাইথন 3 এবং পাইথন 2 উভয়ের জন্য আপনি pyautogui( pip install pyautogui) ব্যবহার করতে পারেন

from pyautogui import press, typewrite, hotkey

press('a')
typewrite('quick brown fox')
hotkey('ctrl', 'w')

এটি উইন্ডোজ, ওএসএক্স এবং উবুন্টু এলটিএসের সাথে ক্রসপ্ল্যাটফর্মও।


4
pressমিডিয়া কীগুলির সাথেও কাজ করে। আমি এটি দিয়ে আমার কম্পিউটারটি নিঃশব্দ করতে ব্যবহার করিpress('volumemute')
কর্নস্মিথ

4
এটি কাজ করে তবে এটি গৃহীত উত্তরের চেয়ে ধীর। (আমার অ্যাপ্লিকেশনটির জন্য খুব ধীর গতির, যার জন্য খুব কম বিলম্বের প্রয়োজন))
টিমএইচ - কোডিপ্যাক্ট

আমি এমন কিছু পরিস্থিতিতে পড়েছি যেখানে অ্যাপ্লিকেশনগুলি পায়ুতোগুইয়ের মাধ্যমে আদেশগুলি গ্রহণ করবে না, তবে সাইটাইপগুলি ধারাবাহিকভাবে কাজ করে বলে মনে হচ্ছে।
অ্যালিসন উইলসন

4
এই পিউটোগুই প্যাকেজটি ক্রস প্ল্যাটফর্ম, ম্যাক এবং উইন্ডোতে কাজ করে
চার্লস চৌ চৌ

@ চার্লসচ্যো ভাল কল, এটি লোকদের জন্য লক্ষ্য করার মতো তাই আমি এটি উত্তরে যুক্ত করেছি। এবং এটি উবুন্টুর সাথেও কাজ করে (এলটিএস এবং কেবলমাত্র
গিথাব

11

কমপক্ষে আমার জন্য ব্যবহারকারীর 648852 এর ধারণাটি ওএস এক্সের জন্য দুর্দান্ত কাজ করে, এটি করার কোডটি এখানে:

#!/usr/bin/env python

import time
from Quartz.CoreGraphics import CGEventCreateKeyboardEvent
from Quartz.CoreGraphics import CGEventPost

# Python releases things automatically, using CFRelease will result in a scary error
#from Quartz.CoreGraphics import CFRelease

from Quartz.CoreGraphics import kCGHIDEventTap

# From http://stackoverflow.com/questions/281133/controlling-the-mouse-from-python-in-os-x
# and from https://developer.apple.com/library/mac/documentation/Carbon/Reference/QuartzEventServicesRef/index.html#//apple_ref/c/func/CGEventCreateKeyboardEvent


def KeyDown(k):
    keyCode, shiftKey = toKeyCode(k)

    time.sleep(0.0001)

    if shiftKey:
        CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, True))
        time.sleep(0.0001)

    CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, True))
    time.sleep(0.0001)

    if shiftKey:
        CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, False))
        time.sleep(0.0001)

def KeyUp(k):
    keyCode, shiftKey = toKeyCode(k)

    time.sleep(0.0001)

    CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, False))
    time.sleep(0.0001)

def KeyPress(k):
    keyCode, shiftKey = toKeyCode(k)

    time.sleep(0.0001)

    if shiftKey:
        CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, True))
        time.sleep(0.0001)

    CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, True))
    time.sleep(0.0001)

    CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, False))
    time.sleep(0.0001)

    if shiftKey:
        CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, False))
        time.sleep(0.0001)



# From http://stackoverflow.com/questions/3202629/where-can-i-find-a-list-of-mac-virtual-key-codes

def toKeyCode(c):
    shiftKey = False
    # Letter
    if c.isalpha():
        if not c.islower():
            shiftKey = True
            c = c.lower()

    if c in shiftChars:
        shiftKey = True
        c = shiftChars[c]
    if c in keyCodeMap:
        keyCode = keyCodeMap[c]
    else:
        keyCode = ord(c)
    return keyCode, shiftKey

shiftChars = {
    '~': '`',
    '!': '1',
    '@': '2',
    '#': '3',
    '$': '4',
    '%': '5',
    '^': '6',
    '&': '7',
    '*': '8',
    '(': '9',
    ')': '0',
    '_': '-',
    '+': '=',
    '{': '[',
    '}': ']',
    '|': '\\',
    ':': ';',
    '"': '\'',
    '<': ',',
    '>': '.',
    '?': '/'
}


keyCodeMap = {
    'a'                 : 0x00,
    's'                 : 0x01,
    'd'                 : 0x02,
    'f'                 : 0x03,
    'h'                 : 0x04,
    'g'                 : 0x05,
    'z'                 : 0x06,
    'x'                 : 0x07,
    'c'                 : 0x08,
    'v'                 : 0x09,
    'b'                 : 0x0B,
    'q'                 : 0x0C,
    'w'                 : 0x0D,
    'e'                 : 0x0E,
    'r'                 : 0x0F,
    'y'                 : 0x10,
    't'                 : 0x11,
    '1'                 : 0x12,
    '2'                 : 0x13,
    '3'                 : 0x14,
    '4'                 : 0x15,
    '6'                 : 0x16,
    '5'                 : 0x17,
    '='                 : 0x18,
    '9'                 : 0x19,
    '7'                 : 0x1A,
    '-'                 : 0x1B,
    '8'                 : 0x1C,
    '0'                 : 0x1D,
    ']'                 : 0x1E,
    'o'                 : 0x1F,
    'u'                 : 0x20,
    '['                 : 0x21,
    'i'                 : 0x22,
    'p'                 : 0x23,
    'l'                 : 0x25,
    'j'                 : 0x26,
    '\''                : 0x27,
    'k'                 : 0x28,
    ';'                 : 0x29,
    '\\'                : 0x2A,
    ','                 : 0x2B,
    '/'                 : 0x2C,
    'n'                 : 0x2D,
    'm'                 : 0x2E,
    '.'                 : 0x2F,
    '`'                 : 0x32,
    'k.'                : 0x41,
    'k*'                : 0x43,
    'k+'                : 0x45,
    'kclear'            : 0x47,
    'k/'                : 0x4B,
    'k\n'               : 0x4C,
    'k-'                : 0x4E,
    'k='                : 0x51,
    'k0'                : 0x52,
    'k1'                : 0x53,
    'k2'                : 0x54,
    'k3'                : 0x55,
    'k4'                : 0x56,
    'k5'                : 0x57,
    'k6'                : 0x58,
    'k7'                : 0x59,
    'k8'                : 0x5B,
    'k9'                : 0x5C,

    # keycodes for keys that are independent of keyboard layout
    '\n'                : 0x24,
    '\t'                : 0x30,
    ' '                 : 0x31,
    'del'               : 0x33,
    'delete'            : 0x33,
    'esc'               : 0x35,
    'escape'            : 0x35,
    'cmd'               : 0x37,
    'command'           : 0x37,
    'shift'             : 0x38,
    'caps lock'         : 0x39,
    'option'            : 0x3A,
    'ctrl'              : 0x3B,
    'control'           : 0x3B,
    'right shift'       : 0x3C,
    'rshift'            : 0x3C,
    'right option'      : 0x3D,
    'roption'           : 0x3D,
    'right control'     : 0x3E,
    'rcontrol'          : 0x3E,
    'fun'               : 0x3F,
    'function'          : 0x3F,
    'f17'               : 0x40,
    'volume up'         : 0x48,
    'volume down'       : 0x49,
    'mute'              : 0x4A,
    'f18'               : 0x4F,
    'f19'               : 0x50,
    'f20'               : 0x5A,
    'f5'                : 0x60,
    'f6'                : 0x61,
    'f7'                : 0x62,
    'f3'                : 0x63,
    'f8'                : 0x64,
    'f9'                : 0x65,
    'f11'               : 0x67,
    'f13'               : 0x69,
    'f16'               : 0x6A,
    'f14'               : 0x6B,
    'f10'               : 0x6D,
    'f12'               : 0x6F,
    'f15'               : 0x71,
    'help'              : 0x72,
    'home'              : 0x73,
    'pgup'              : 0x74,
    'page up'           : 0x74,
    'forward delete'    : 0x75,
    'f4'                : 0x76,
    'end'               : 0x77,
    'f2'                : 0x78,
    'page down'         : 0x79,
    'pgdn'              : 0x79,
    'f1'                : 0x7A,
    'left'              : 0x7B,
    'right'             : 0x7C,
    'down'              : 0x7D,
    'up'                : 0x7E
}

6

আমি লিব কীবোর্ড চেষ্টা করেছি এবং এটি উইন্ডোজে ভাল কাজ করে। নীচের লাইনের সাহায্যে ব্রাউজারে ট্যাবগুলি স্যুইচ করতে সহায়তা করে:

keyboard.press_and_release('ctrl+tab')

ম্যাকের পাশাপাশি ভাল কাজ করে। আমি লিনাক্স পরীক্ষা করিনি, তবে এটি কাজ করা উচিত।
দাউদ তাগাওহী-নেজাদ

5

আমার একই সমস্যা ছিল এবং এটির জন্য আমার নিজস্ব লাইব্রেরি তৈরি করা হয়েছে যা সিটি টাইপ ব্যবহার করে:

"""
< --- CTRL by [object Object] --- >
Only works on windows.
Some characters only work with a US standard keyboard.
Some parts may also only work in python 32-bit.
"""

#--- Setup ---#
from ctypes import *
from time import sleep
user32 = windll.user32
kernel32 = windll.kernel32
delay = 0.01

####################################
###---KEYBOARD CONTROL SECTION---###
####################################

#--- Key Code Variables ---#
class key:
        cancel = 0x03
        backspace = 0x08
        tab = 0x09
        enter = 0x0D
        shift = 0x10
        ctrl = 0x11
        alt = 0x12
        capslock = 0x14
        esc = 0x1B
        space = 0x20
        pgup = 0x21
        pgdown = 0x22
        end = 0x23
        home = 0x24
        leftarrow = 0x26
        uparrow = 0x26
        rightarrow = 0x27
        downarrow = 0x28
        select = 0x29
        print = 0x2A
        execute = 0x2B
        printscreen = 0x2C
        insert = 0x2D
        delete = 0x2E
        help = 0x2F
        num0 = 0x30
        num1 = 0x31
        num2 = 0x32
        num3 = 0x33
        num4 = 0x34
        num5 = 0x35
        num6 = 0x36
        num7 = 0x37
        num8 = 0x38
        num9 = 0x39
        a = 0x41
        b = 0x42
        c = 0x43
        d = 0x44
        e = 0x45
        f = 0x46
        g = 0x47
        h = 0x48
        i = 0x49
        j = 0x4A
        k = 0x4B
        l = 0x4C
        m = 0x4D
        n = 0x4E
        o = 0x4F
        p = 0x50
        q = 0x51
        r = 0x52
        s = 0x53
        t = 0x54
        u = 0x55
        v = 0x56
        w = 0x57
        x = 0x58
        y = 0x59
        z = 0x5A
        leftwin = 0x5B
        rightwin = 0x5C
        apps = 0x5D
        sleep = 0x5F
        numpad0 = 0x60
        numpad1 = 0x61
        numpad3 = 0x63
        numpad4 = 0x64
        numpad5 = 0x65
        numpad6 = 0x66
        numpad7 = 0x67
        numpad8 = 0x68
        numpad9 = 0x69
        multiply = 0x6A
        add = 0x6B
        seperator = 0x6C
        subtract = 0x6D
        decimal = 0x6E
        divide = 0x6F
        F1 = 0x70
        F2 = 0x71
        F3 = 0x72
        F4 = 0x73
        F5 = 0x74
        F6 = 0x75
        F7 = 0x76
        F8 = 0x77
        F9 = 0x78
        F10 = 0x79
        F11 = 0x7A
        F12 = 0x7B
        F13 = 0x7C
        F14 = 0x7D
        F15 = 0x7E
        F16 = 0x7F
        F17 = 0x80
        F19 = 0x82
        F20 = 0x83
        F21 = 0x84
        F22 = 0x85
        F23 = 0x86
        F24 = 0x87
        numlock = 0x90
        scrolllock = 0x91
        leftshift = 0xA0
        rightshift = 0xA1
        leftctrl = 0xA2
        rightctrl = 0xA3
        leftmenu = 0xA4
        rightmenu = 0xA5
        browserback = 0xA6
        browserforward = 0xA7
        browserrefresh = 0xA8
        browserstop = 0xA9
        browserfavories = 0xAB
        browserhome = 0xAC
        volumemute = 0xAD
        volumedown = 0xAE
        volumeup = 0xAF
        nexttrack = 0xB0
        prevoustrack = 0xB1
        stopmedia = 0xB2
        playpause = 0xB3
        launchmail = 0xB4
        selectmedia = 0xB5
        launchapp1 = 0xB6
        launchapp2 = 0xB7
        semicolon = 0xBA
        equals = 0xBB
        comma = 0xBC
        dash = 0xBD
        period = 0xBE
        slash = 0xBF
        accent = 0xC0
        openingsquarebracket = 0xDB
        backslash = 0xDC
        closingsquarebracket = 0xDD
        quote = 0xDE
        play = 0xFA
        zoom = 0xFB
        PA1 = 0xFD
        clear = 0xFE

#--- Keyboard Control Functions ---#

# Category variables
letters = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"
shiftsymbols = "~!@#$%^&*()_+QWERTYUIOP{}|ASDFGHJKL:\"ZXCVBNM<>?"

# Presses and releases the key
def press(key):
        user32.keybd_event(key, 0, 0, 0)
        sleep(delay)
        user32.keybd_event(key, 0, 2, 0)
        sleep(delay)

# Holds a key
def hold(key):
        user32.keybd_event(key, 0, 0, 0)
        sleep(delay)

# Releases a key
def release(key):
        user32.keybd_event(key, 0, 2, 0)
        sleep(delay)

# Types out a string
def typestr(sentence):
        for letter in sentence:
                shift = letter in shiftsymbols
                fixedletter = "space"
                if letter == "`" or letter == "~":
                        fixedletter = "accent"
                elif letter == "1" or letter == "!":
                        fixedletter = "num1"
                elif letter == "2" or letter == "@":
                        fixedletter = "num2"
                elif letter == "3" or letter == "#":
                        fixedletter = "num3"
                elif letter == "4" or letter == "$":
                        fixedletter = "num4"
                elif letter == "5" or letter == "%":
                        fixedletter = "num5"
                elif letter == "6" or letter == "^":
                        fixedletter = "num6"
                elif letter == "7" or letter == "&":
                        fixedletter = "num7"
                elif letter == "8" or letter == "*":
                        fixedletter = "num8"
                elif letter == "9" or letter == "(":
                        fixedletter = "num9"
                elif letter == "0" or letter == ")":
                        fixedletter = "num0"
                elif letter == "-" or letter == "_":
                        fixedletter = "dash"
                elif letter == "=" or letter == "+":
                        fixedletter = "equals"
                elif letter in letters:
                        fixedletter = letter.lower()
                elif letter == "[" or letter == "{":
                        fixedletter = "openingsquarebracket"
                elif letter == "]" or letter == "}":
                        fixedletter = "closingsquarebracket"
                elif letter == "\\" or letter == "|":
                        fixedletter == "backslash"
                elif letter == ";" or letter == ":":
                        fixedletter = "semicolon"
                elif letter == "'" or letter == "\"":
                        fixedletter = "quote"
                elif letter == "," or letter == "<":
                        fixedletter = "comma"
                elif letter == "." or letter == ">":
                        fixedletter = "period"
                elif letter == "/" or letter == "?":
                        fixedletter = "slash"
                elif letter == "\n":
                        fixedletter = "enter"
                keytopress = eval("key." + str(fixedletter))
                if shift:
                        hold(key.shift)
                        press(keytopress)
                        release(key.shift)
                else:
                        press(keytopress)

#--- Mouse Variables ---#
                        
class mouse:
        left = [0x0002, 0x0004]
        right = [0x0008, 0x00010]
        middle = [0x00020, 0x00040]

#--- Mouse Control Functions ---#

# Moves mouse to a position
def move(x, y):
        user32.SetCursorPos(x, y)

# Presses and releases mouse
def click(button):
        user32.mouse_event(button[0], 0, 0, 0, 0)
        sleep(delay)
        user32.mouse_event(button[1], 0, 0, 0, 0)
        sleep(delay)

# Holds a mouse button
def holdclick(button):
        user32.mouse_event(button[0], 0, 0, 0, 0)
        sleep(delay)

# Releases a mouse button
def releaseclick(button):
        user32.mouse_event(button[1])
        sleep(delay)

2

প্রতিটি প্ল্যাটফর্মের কীবোর্ড ইভেন্ট উত্পন্ন করতে সক্ষম হওয়ার জন্য আলাদা পদ্ধতি থাকতে চলেছে। এর কারণ তাদের প্রত্যেককে সিস্টেম লাইব্রেরি (এবং সিস্টেম এক্সটেনশান) ব্যবহার করা প্রয়োজন। ক্রস প্ল্যাটফর্ম সমাধানের জন্য, আপনাকে এই সমাধানগুলি প্রতিটি নিতে হবে এবং যথাযথ পদ্ধতিটি সম্পাদন করতে প্ল্যাটফর্ম চেকের মধ্যে আবদ্ধ করতে হবে।

উইন্ডোগুলির জন্য, আপনি পাইউইন 32 এক্সটেনশনটি ব্যবহার করতে সক্ষম হতে পারেন । win32api.keybd_event

win32api.keybd_event

কীবিডি_উভেন্ট (বিভিকে, বিস্কেন, ডিডব্ল্যাফ্লাগস, ডিডুএক্সট্রাআইএনফো)

একটি কীবোর্ড ইভেন্ট অনুকরণ

পরামিতি

bVk: বাইট - ভার্চুয়াল-চাবি কোড
bScan: বাইট - হার্ডওয়্যার স্ক্যান কোড
dwFlags = 0: DWORD - বিভিন্ন ফাংশন অপশন উল্লেখ পতাকা
dwExtraInfo = 0: - কীস্ট্রোক সঙ্গে যুক্ত অতিরিক্ত ডেটা DWORD

কীভাবে এটি সঠিকভাবে ব্যবহার করতে হয় তার জন্য আপনাকে পাইউইন 32 তদন্ত করতে হবে, কারণ আমি এটি কখনও ব্যবহার করি নি।


2

কেবলমাত্র উইন্ডোজ: আপনি হয় আইরনপাইথন বা একটি লাইব্রেরি ব্যবহার করতে পারেন যা সিপাইথনকে উইন্ডোজের .NET ফ্রেমওয়ার্কগুলিতে অ্যাক্সেস করতে দেয়। তারপরে .NET এর সেন্ডকি ক্লাস ব্যবহার করুন বা কী-স্ট্রোক অনুকরণ করতে আরও সাধারণ প্রেরণ করুন

কেবলমাত্র ওএস এক্স: পাইওবিজেসি ব্যবহার করুন তারপরে ব্যবহার CGEventCreateKeyboardEventকল ব্যবহার করুন।

সম্পূর্ণ প্রকাশ: আমি পাইথনের সাহায্যে ওএস এক্সে এটিই করেছি, তবে আমি নেট নেট সেনকি (সি # সহ) ব্যবহার করেছি এবং এটি দুর্দান্ত কাজ করে।


আমি আয়রন পাইথন থেকে নেট নেট সেন্ডকিগুলি ব্যবহার করেছি (একটি ডেস্কটপ অ্যাপ্লিকেশনটির গ্রহণযোগ্যতা পরীক্ষার কাঠামোর জন্য) এবং এটি দুর্দান্ত কাজ করেছে।
জোনাথন হার্টলি

4
python for .net। এএ সলিউশন, আমি কীভাবে ব্যবহার করব sendkeys। আপনি সম্ভবত একটি উদাহরণ দিতে পারেন?
ইনবার রোজ

2

ম্যাক অপারেটিং সিস্টেম

কোড উদাহরণ সহ ক্লাস আকারে @ ফিলিইডা উত্তরের আরও সম্পূর্ণ সংস্করণ এখানে রয়েছে :

#!/usr/bin/python
# Script simulating keyboard events in macOS.
# See: https://stackoverflow.com/q/13564851/55075

import sys
import time
from Quartz.CoreGraphics import CGEventCreateKeyboardEvent
from Quartz.CoreGraphics import CGEventPost
from Quartz.CoreGraphics import kCGHIDEventTap
#from Quartz.CoreGraphics import CFRelease # Python releases things automatically.

class Keyboard():
    shiftChars = {
        '~': '`',
        '!': '1',
        '@': '2',
        '#': '3',
        '$': '4',
        '%': '5',
        '^': '6',
        '&': '7',
        '*': '8',
        '(': '9',
        ')': '0',
        '_': '-',
        '+': '=',
        '{': '[',
        '}': ']',
        '|': '\\',
        ':': ';',
        '"': '\'',
        '<': ',',
        '>': '.',
        '?': '/'
    }


    keyCodeMap = {
        'a'              : 0x00,
        's'              : 0x01,
        'd'              : 0x02,
        'f'              : 0x03,
        'h'              : 0x04,
        'g'              : 0x05,
        'z'              : 0x06,
        'x'              : 0x07,
        'c'              : 0x08,
        'v'              : 0x09,
        'b'              : 0x0B,
        'q'              : 0x0C,
        'w'              : 0x0D,
        'e'              : 0x0E,
        'r'              : 0x0F,
        'y'              : 0x10,
        't'              : 0x11,
        '1'              : 0x12,
        '2'              : 0x13,
        '3'              : 0x14,
        '4'              : 0x15,
        '6'              : 0x16,
        '5'              : 0x17,
        '='              : 0x18,
        '9'              : 0x19,
        '7'              : 0x1A,
        '-'              : 0x1B,
        '8'              : 0x1C,
        '0'              : 0x1D,
        ']'              : 0x1E,
        'o'              : 0x1F,
        'u'              : 0x20,
        '['              : 0x21,
        'i'              : 0x22,
        'p'              : 0x23,
        'l'              : 0x25,
        'j'              : 0x26,
        '\''             : 0x27,
        'k'              : 0x28,
        ';'              : 0x29,
        '\\'             : 0x2A,
        ','              : 0x2B,
        '/'              : 0x2C,
        'n'              : 0x2D,
        'm'              : 0x2E,
        '.'              : 0x2F,
        '`'              : 0x32,
        'k.'             : 0x41,
        'k*'             : 0x43,
        'k+'             : 0x45,
        'kclear'         : 0x47,
        'k/'             : 0x4B,
        'k\n'            : 0x4C,
        'k-'             : 0x4E,
        'k='             : 0x51,
        'k0'             : 0x52,
        'k1'             : 0x53,
        'k2'             : 0x54,
        'k3'             : 0x55,
        'k4'             : 0x56,
        'k5'             : 0x57,
        'k6'             : 0x58,
        'k7'             : 0x59,
        'k8'             : 0x5B,
        'k9'             : 0x5C,

        # keycodes for keys that are independent of keyboard layout
        '\n'             : 0x24,
        '\t'             : 0x30,
        ' '              : 0x31,
        'del'            : 0x33,
        'delete'         : 0x33,
        'esc'            : 0x35,
        'escape'         : 0x35,
        'cmd'            : 0x37,
        'command'        : 0x37,
        'shift'          : 0x38,
        'caps lock'      : 0x39,
        'option'         : 0x3A,
        'ctrl'           : 0x3B,
        'control'        : 0x3B,
        'right shift'    : 0x3C,
        'rshift'         : 0x3C,
        'right option'   : 0x3D,
        'roption'        : 0x3D,
        'right control'  : 0x3E,
        'rcontrol'       : 0x3E,
        'fun'            : 0x3F,
        'function'       : 0x3F,
        'f17'            : 0x40,
        'volume up'      : 0x48,
        'volume down'    : 0x49,
        'mute'           : 0x4A,
        'f18'            : 0x4F,
        'f19'            : 0x50,
        'f20'            : 0x5A,
        'f5'             : 0x60,
        'f6'             : 0x61,
        'f7'             : 0x62,
        'f3'             : 0x63,
        'f8'             : 0x64,
        'f9'             : 0x65,
        'f11'            : 0x67,
        'f13'            : 0x69,
        'f16'            : 0x6A,
        'f14'            : 0x6B,
        'f10'            : 0x6D,
        'f12'            : 0x6F,
        'f15'            : 0x71,
        'help'           : 0x72,
        'home'           : 0x73,
        'pgup'           : 0x74,
        'page up'        : 0x74,
        'forward delete' : 0x75,
        'f4'             : 0x76,
        'end'            : 0x77,
        'f2'             : 0x78,
        'page down'      : 0x79,
        'pgdn'           : 0x79,
        'f1'             : 0x7A,
        'left'           : 0x7B,
        'right'          : 0x7C,
        'down'           : 0x7D,
        'up'             : 0x7E
    }

    # See: https://stackoverflow.com/q/3202629/55075
    def toKeyCode(self, c):
        shiftKey = False
        # Letter
        if c.isalpha():
            if not c.islower():
                shiftKey = True
                c = c.lower()
        if c in Keyboard.shiftChars:
            shiftKey = True
            c = Keyboard.shiftChars[c]
        if c in Keyboard.keyCodeMap:
            keyCode = Keyboard.keyCodeMap[c]
        else:
            keyCode = ord(c)
        return keyCode, shiftKey

    def KeyDown(self, k):
        keyCode, shiftKey = self.toKeyCode(k)

        time.sleep(0.0001)

        if shiftKey:
            CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, True))
            time.sleep(0.0001)

        CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, True))
        time.sleep(0.0001)

        if shiftKey:
            CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, False))
            time.sleep(0.0001)

    def KeyUp(self, k):
        keyCode, shiftKey = self.toKeyCode(k)

        time.sleep(0.0001)

        CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, False))
        time.sleep(0.0001)

    def KeyPress(self, k):
        keyCode, shiftKey = self.toKeyCode(k)

        time.sleep(0.0001)

        if shiftKey:
            CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, True))
            time.sleep(0.0001)

        CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, True))
        time.sleep(0.0001)

        CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, False))
        time.sleep(0.0001)

        if shiftKey:
            CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, False))
            time.sleep(0.0001)

    def Type(self, text):
        for key in text:
            self.KeyDown(key)
            self.KeyUp(key)

উপরের ক্লাসটি ব্যবহার করে এখানে ডেমো কোড দেওয়া হচ্ছে:

# DEMO
if __name__ == '__main__':
    keyboard = Keyboard()
    if sys.platform == "darwin":
        keyboard.Type('Hello World!')
    elif sys.platform == "win32":
        print("Error: Platform not supported!")

যা Hello World!বর্তমান উইন্ডোতে টাইপিং পাঠ্য অনুকরণ করবে ।

আপনি শেল স্ক্রিপ্ট হিসাবে উপরের কোড চালাতে পারেন। keyboard.pyফাইলটির লিঙ্কটি পরীক্ষা করুন


2

পাইথন 2.7 (উইন্ডোজ 32) এর জন্য আমি কেবল পাইউইন 32-223 ইনস্টল করেছি । এবং আমি সাধারণ অজগর কোড লিখেছি:

import win32api
import time
import win32con

# simulate the pressing-DOWN "ARROW key" of 200 times

for i in range(200):
   time.sleep(0.5)
   win32api.keybd_event(0x28, 0,0,0)
   time.sleep(.05)
   win32api.keybd_event(0x28,0 ,win32con.KEYEVENTF_KEYUP ,0)

আপনি কোডটি চালাচ্ছেন এবং তাত্ক্ষণিকভাবে নোটপ্যাড উইন্ডোতে যান (যেখানে টেক্সটটি ইতিমধ্যে বিদ্যমান রয়েছে) এবং উপরের লাইনে কার্সারটি রেখেছেন কিনা এটি পরীক্ষা করা যায়।


সেই একই একই keybd_event ফাংশনটি ইতিমধ্যে সিটিপিতে উপস্থিত রয়েছে
অবজেক্ট-অবজেক্ট

ctypes.windll.user32.keybd_event (0x01, 0, 0, 0)
অবজেক্ট-অবজেক্ট

0

প্রস্তাবিত উত্তরের কোড সম্পর্কিত,

আমার বটের জন্য প্রস্তাবিত উত্তরটি কার্যকর হয়নি। এটি কারণ আমি ক্রোম ব্যবহার করছি যা আমার dwFlags- এ KEYEVENTF_SCANCODE ব্যবহার করার প্রয়োজন বোধ করে।

তার কোডটি কাজ করতে পেতে আমাকে এই কোডগুলি ব্লকটি সংশোধন করতে হয়েছিল:

class KEYBDINPUT(ctypes.Structure):
    _fields_ = (("wVk",         wintypes.WORD),
                ("wScan",       wintypes.WORD),
                ("dwFlags",     wintypes.DWORD),
                ("time",        wintypes.DWORD),
                ("dwExtraInfo", wintypes.ULONG_PTR))

    def __init__(self, *args, **kwds):
        super(KEYBDINPUT, self).__init__(*args, **kwds)
        # some programs use the scan code even if KEYEVENTF_SCANCODE
        # isn't set in dwFflags, so attempt to map the correct code.
        #if not self.dwFlags & KEYEVENTF_UNICODE:l
            #self.wScan = user32.MapVirtualKeyExW(self.wVk,
                                                 #MAPVK_VK_TO_VSC, 0)
            # ^MAKE SURE YOU COMMENT/REMOVE THIS CODE^

def PressKey(keyCode):
    input = INPUT(type=INPUT_KEYBOARD,
              ki=KEYBDINPUT(wScan=keyCode,
                            dwFlags=KEYEVENTF_SCANCODE))
    user32.SendInput(1, ctypes.byref(input), ctypes.sizeof(input))

def ReleaseKey(keyCode):
    input = INPUT(type=INPUT_KEYBOARD,
              ki=KEYBDINPUT(wScan=keyCode,
                            dwFlags=KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP))
    user32.SendInput(1, ctypes.byref(input), ctypes.sizeof(input))

time.sleep(5) # sleep to open browser tab
PressKey(0x26) # press right arrow key
time.sleep(2) # hold for 2 seconds
ReleaseKey(0x26) # release right arrow key

আমি আশা করি এটি কারও মাথা ব্যথায় সহায়তা করে!


0
    def keyboardevent():
         keyboard.press_and_release('a')
         keyboard.press_and_release('shift + b')
         
    keyboardevent()

4
স্ট্যাকওভারফ্লোতে আপনাকে স্বাগতম। এই কোডটি কীভাবে এবং কেন সমস্যার সমাধান করে তার ব্যাখ্যা সহ প্রশ্নটি সমাধান করতে পারে যদিও আপনার পোস্টের মান উন্নত করতে সত্যই সহায়তা করবে এবং সম্ভবত আরও বেশি ভোটের ফলাফল হবে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, কেবল এখন যে ব্যক্তি জিজ্ঞাসা করছেন তা নয়। ব্যাখ্যা যুক্ত করতে আপনার উত্তরটি সম্পাদনা করুন এবং কোন সীমাবদ্ধতা এবং অনুমানগুলি প্রযোজ্য তা একটি ইঙ্গিত দিন।
রুলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.