मैं अजगर में हॉटस्ट्रिंग बनाना चाहता हूं जो कुछ प्रसंस्करण के बाद एक शब्द को दूसरे में टाइप करने पर परिवर्तित करता है, क्योंकि एएचके बहुत सीमित है जब यह निर्धारित करने की बात आती है कि किस शब्द को टाइप करना है। अभी, मैं एएचके में एक हॉटस्ट्रिंग का उपयोग कर रहा हूं जो कमांड लाइन पर कोड चलाता है जो एक पायथन स्क्रिप्ट को उस शब्द के साथ चलाता है जिसे मैंने तर्क के रूप में टाइप किया था। फिर मैं शब्द टाइप करने के लिए pyautogui का उपयोग करता हूं। हालाँकि, यह बहुत धीमा है और गति से टाइप करने पर काम नहीं करता है। मैं यह सब अजगर के साथ और आह के बिना करने का एक तरीका ढूंढ रहा हूं, लेकिन मुझे अजगर में हॉटस्ट्रिंग करने का कोई तरीका नहीं मिला है। उदाहरण के लिए, हर बार जब मैं "परीक्षण" शब्द टाइप करता हूं तो यह इसे "परीक्षण" से बदल देता है। आपकी सहायता के लिए धन्यवाद। मैं पायथन और विंडोज 10 का नवीनतम संस्करण चला रहा हूं, अगर यह किसी के लिए भी उपयोगी है।

1
Jack N 18 जिंदा 2021, 21:26
1
"चूंकि AHK यह निर्धारित करने के लिए बहुत सीमित है कि कौन सा शब्द टाइप करना है" मुझे लगता है कि आप इसे करना नहीं जानते हैं। मुझे संदेह है कि आप हॉटस्ट्रिंग प्रतिस्थापन के बारे में सोच सकते हैं जो पाइथन में संभव है, लेकिन एएचके में नहीं। क्या आप अपना एएचके कोड साझा कर सकते हैं जो आपने करने की कोशिश की?
 – 
0x464e
18 जिंदा 2021, 21:44
यह चुनने के लिए कि किस शब्द को टाइप करना है, यह मशीन लर्निंग एल्गोरिथम का उपयोग करेगा और बहुत जटिल मैट्रिक्स से विकल्प जो AHK में करना संभव नहीं है।
 – 
Jack N
18 जिंदा 2021, 21:59
ठीक है, यह नया है। मुझे लगता है कि मैं इस पर टिप्पणी नहीं कर सकता कि ऐसा करना कितना संभव होगा क्योंकि मुझे नहीं पता कि यह मशीन लर्निंग एल्गोरिदम क्या है। हो सकता है कि ध्यान देने योग्य एक विकल्प आपकी AHK स्क्रिप्ट के बीच संचार कर रहा हो और आपके पास जो कुछ भी है वह मशीन लर्निंग एल्गोरिथम का ध्यान रखेगा। OnMessage() के लिए दस्तावेज एक सरल दिखाता है कस्टम संदेश प्राप्त करने का तरीका।
 – 
0x464e
18 जिंदा 2021, 22:11
आपकी सहायता के लिए धन्यवाद। मैं उस पर एक नज़र डालूँगा। आदर्श रूप से हालांकि, यह सब पाइथन में किया जाएगा, क्योंकि पाइथन एनएलपी के लिए काफी बेहतर है और फिर देरी कम होगी।
 – 
Jack N
18 जिंदा 2021, 22:14

1 उत्तर

सबसे बढ़िया उत्तर

(यदि आप इसे संसाधित करना चाहते हैं क्योंकि प्रत्येक अक्षर टाइप किया गया है (टी, टी, टीईएस, टेस्ट), तो आपको अपना प्रश्न संपादित करना चाहिए)

मैं ahk हॉटकी का उपयोग करके अपने SymPy फ़ंक्शन को कॉल करता हूं। मैं अजगर स्क्रिप्ट को COM सर्वर के रूप में पंजीकृत करता हूं और ahk का उपयोग करके इसे लोड करता हूं।
मुझे कोई विलंबता नहीं दिखाई दे रही है।

आपको pywin32 की आवश्यकता होगी, लेकिन pip install pywin32
. का उपयोग करके डाउनलोड न करें https://github.com/mhammond/pywin32/releases
से डाउनलोड करें या फिर यह AutoHotkeyU64.exe के लिए काम नहीं करेगा, यह केवल AutoHotkeyU32.exe के लिए काम करेगा।
amd64 डाउनलोड करना सुनिश्चित करें, (मैंने pywin32-300.win-amd64-py3.8.exe डाउनलोड किया)
ऐसा क्यों है: 64bit python COM सर्वर को कैसे रजिस्टर करें< /ए>

Toअपरकेस COM server.py

class BasicServer:
    # list of all method names exposed to COM
    _public_methods_ = ["toUppercase"]

    @staticmethod
    def toUppercase(string):
        return string.upper()
        
if __name__ == "__main__":
    import sys

    if len(sys.argv) < 2:
        print("Error: need to supply arg (""--register"" or ""--unregister"")")
        sys.exit(1)
    else:
        import win32com.server.register
        import win32com.server.exception

        # this server's CLSID
        # NEVER copy the following ID 
        # Use "print(pythoncom.CreateGuid())" to make a new one.
        myClsid="{C70F3BF7-2947-4F87-B31E-9F5B8B13D24F}"
        # this server's (user-friendly) program ID
        myProgID="Python.stringUppercaser"
        
        import ctypes
        def make_sure_is_admin():
            try:
                if ctypes.windll.shell32.IsUserAnAdmin():
                    return
            except:
                pass
            exit("YOU MUST RUN THIS AS ADMIN")
        
        if sys.argv[1] == "--register":
            make_sure_is_admin()
                
            import pythoncom
            import os.path
            realPath = os.path.realpath(__file__)
            dirName = os.path.dirname(realPath)
            nameOfThisFile = os.path.basename(realPath)
            nameNoExt = os.path.splitext(nameOfThisFile)[0]
            # stuff will be written here
            # HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\${myClsid}
            # HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{C70F3BF7-2947-4F87-B31E-9F5B8B13D24F}
            # and here
            # HKEY_LOCAL_MACHINE\SOFTWARE\Classes\${myProgID}
            # HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.stringUppercaser
            win32com.server.register.RegisterServer(
                clsid=myClsid,
                # I guess this is {fileNameNoExt}.{className}
                pythonInstString=nameNoExt + ".BasicServer", #toUppercase COM server.BasicServer
                progID=myProgID,
                # optional description
                desc="return uppercased string",
                #we only want the registry key LocalServer32
                #we DO NOT WANT InProcServer32: pythoncom39.dll, NO NO NO
                clsctx=pythoncom.CLSCTX_LOCAL_SERVER,
                #this is needed if this file isn't in PYTHONPATH: it tells regedit which directory this file is located
                #this will write HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{C70F3BF7-2947-4F87-B31E-9F5B8B13D24F}\PythonCOMPath : dirName
                addnPath=dirName,
            )
            print("Registered COM server.")
            # don't use UseCommandLine(), as it will write InProcServer32: pythoncom39.dll
            # win32com.server.register.UseCommandLine(BasicServer)
        elif sys.argv[1] == "--unregister":
            make_sure_is_admin()

            print("Starting to unregister...")

            win32com.server.register.UnregisterServer(myClsid, myProgID)

            print("Unregistered COM server.")
        else:
            print("Error: arg not recognized")

आपको सबसे पहले अजगर COM सर्वर को पंजीकृत करना होगा:
सबसे पहले, अपना स्वयं का CLSID प्राप्त करें: बस एक अजगर खोल का उपयोग करें।

import pythoncom
print(pythoncom.CreateGuid())

फिर, उस आउटपुट पर myClsid सेट करें

रजिस्टर करने के लिए:
python "toUppercase COM server.py" --register
अपंजीकृत करने के लिए:
python "toUppercase COM server.py" --unregister

हॉटस्ट्रिंग अजगर toUppercase.ahk

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
#SingleInstance, force
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
SetBatchLines, -1
#KeyHistory 0
ListLines Off
#Persistent
#MaxThreadsPerHotkey 4

pythonComServer:=ComObjCreate("Python.stringUppercaser")
; OR
; pythonComServer:=ComObjCreate("{C70F3BF7-2947-4F87-B31E-9F5B8B13D24F}") ;use your own CLSID


; * do not wait for string to end
; C case sensitive
:*:hello world::

savedHotstring:=A_ThisHotkey

;theActualHotstring=savedHotstring[second colon:end of string]
theActualHotstring:=SubStr(savedHotstring, InStr(savedHotstring, ":",, 2) + 1)
send, % pythonComServer.toUppercase(theActualHotstring)


return



f3::Exitapp

आप हॉटस्ट्रिंग hello world की गति का परीक्षण कर सकते हैं, यह मेरे लिए बहुत तेज़ है।
अपनी पसंद के अनुसार def toUppercase(string): संपादित करें

2
Mr. Doge 12 अक्टूबर 2021, 03:44
आपके गहन सुझाव के लिए धन्यवाद। हालांकि, मुझे लाइन 11 और 13 (जिनके पास ComObjCreate है) के साथ कोई समस्या है। जब मैं कोड निष्पादित करता हूं तो मुझे त्रुटि मिलती है, "निर्दिष्ट मॉड्यूल नहीं मिला।" मुझे निम्न ahk फ़ोरम autohotkey.com/ पर विषय पर थोड़ी जानकारी मिली। बोर्ड/viewtopic.php?t=29394 (ctrl+f "एक परीक्षण सर्वर के लिए मेरा सर्वर कोड है" फोरम में सही स्थान पर पहुंचने के लिए)। हालांकि, मैं वहां दिए गए समाधान को समझने के लिए ComObjCreate से पर्याप्त परिचित नहीं हूं। कृपया मुझे बताएं कि क्या आप इस त्रुटि का समाधान जानते हैं। धन्यवाद।
 – 
Jack N
19 जिंदा 2021, 09:25
आपको python COM server.py नाम की एक फ़ाइल बनाने की आवश्यकता है, हालाँकि आप फ़ाइल नाम बदल सकते हैं, लेकिन आपको इसे हर जगह बदलना होगा
और कोड को कॉपी पेस्ट करना होगा
फिर फ़ाइल के अंदर python COM server.py, बदलें आपके अपने CLSID के लिए _reg_clsid_ का मान जो मैंने आपको बताया था
फिर USING COMMAND LINE को चलाएं (मैंने cmd का उपयोग किया) python "python COM server.py" --register
क्या आपने ऐसा किया? क्या यह सफल रहा? (सीएमडी को Registered: Python.stringUppercaser कहना चाहिए)
 – 
Mr. Doge
20 जिंदा 2021, 02:26
मैं उत्तर को संपादित नहीं करूंगा, कृपया मैं चाहता हूं कि आप इसे संपादित करें, ताकि आप जैसे अन्य लोग समझ सकें। उन हिस्सों को संपादित करें जो पर्याप्त स्पष्ट/स्पष्ट नहीं थे। मुझे नहीं पता कि इसे कैसे समझा जाए, आपको सबसे अच्छा पता होगा
मुझे मेरा कोड [इस सटीक जगह] से मिला है [1], मुझे कोड को थोड़ा संपादित करना पड़ा। मुझे अपने जैसे लोगों की मदद के लिए इस कोड को उस थ्रेड पर पोस्ट करना चाहिए... [1]: autohotkey.com/boards/viewtopic.php?t=29394
 – 
Mr. Doge
20 जिंदा 2021, 02:26
आपकी सहायता के लिए धन्यवाद। आपका उत्तर स्पष्ट था। मैंने दो बार निर्देशों का पालन किया और फिर भी वही त्रुटि मिली। मैंने पाइथन और एएचके प्रोग्राम दोनों में सीएलएसआईडी के रूप में कहा गया, जेनरेट किया और बदल दिया, मैंने पाइथन प्रोग्राम को सफलतापूर्वक सीएमडी (उचित फ़ोल्डर स्थान पर सीडीडी) के साथ पंजीकृत किया, लेकिन मुझे अभी भी वह त्रुटि मिलती है। मुझे लगता है कि यह पाइथन प्रोग्राम के साथ करने के बजाय एएचके स्क्रिप्ट के साथ ही एक समस्या है क्योंकि जब मैं एएचके प्रोग्राम चलाता हूं तो मुझे तुरंत त्रुटि संदेश मिलता है। शायद आप उस सटीक कोड को आज़मा सकते हैं जिसे आपने यह सत्यापित करने के लिए भेजा था कि यह काम करता है। धन्यवाद
 – 
Jack N
20 जिंदा 2021, 03:12
1
बहुत बहुत धन्यवाद, यह मेरे लिए काम करता है! केवल एक चीज यह है कि मुझे import admin और व्यवस्थापक को अन्य संदर्भों पर टिप्पणी करनी थी। जाहिर है, यह डिफ़ॉल्ट रूप से पायथन का हिस्सा नहीं है?
 – 
Cerberus
10 अक्टूबर 2021, 06:44