簡體   English   中英

AutoHotkey的 - 我想設置為轉移帶來的

[英]AutoHotkey - I want to set A to be Shift A

有人可以告訴我如何在 AutoHotkey 中編輯腳本嗎?

我使用宏記錄器來執行多個重復性任務,即多次“向上移動和向下移動”,因此我使用重復按下宏快捷方式。 問題是,在我使用的宏記錄器中,如果您分配帶有修飾符的快捷方式來調用宏(即 Shift A),那么每次要執行宏時都必須釋放修飾符,因此我通常必須(按Shift,按A,松開Shift再松開A),每次我想調用宏時,而不是按Shift,按住它,然后多次按下並松開A。 這更容易。 我正在尋找一個可以解決這個問題的 AutoHotKey 腳本,我有很多這樣的宏,所以我不能為每個宏創建一個 bat 或 exe 文件,我基本上需要一個 AutoHotkey 腳本,如:

if keystate, SHIFT, P
a::
send (Shift down)
send (a down)
send (Shift up)
send (a up)

或任何其他可以在我每次按下 A 時發送 Shift 和 A 鍵的腳本,但前提是按下 Shift 鍵。

我一直在嘗試使用循環,但我只是不知道如何讓它停止。

考慮到我不需要每次要調用宏時都必須釋放並再次按下“Shift + a”,而且還有“Alt + a”和“Alt + Win + a”,每個不同的組合調用不同宏。 因此,將“a”鍵設置為始終為“Shift + a”是個壞主意,因為我需要“a”鍵根據同時按下的其他修飾鍵來執行不同的宏。

我在這個應用程序中使用的熱鍵列表是(每個人都做不同的事情,它不能被任何其他熱鍵取代)

Alt + A
Shift + A
Win + A
Alt + Shift + A
Win + Alt + A

依此類推,大多數字母(S、D、Q、W、E 等以及數字 1、2、3 等)還包括:

Shift + Tab
Win + Tab
Alt + Capslock
Win + Alt + Capslock

(真的很煩人要放開 Shift 和 Tab,然后再次按下它們,每次我想運行一個宏時,我都會重復多次運行這個宏)我認為這些都是熱鍵,它們都做不同的事情我每次都重復運行。

拜托,我確實需要一個腳本,該腳本可以根據同時按下的其他修飾鍵按下相同的“a”鍵來啟動不同的操作。

嗨羅伯特,我不太明白你說的是什么,但我編輯了這樣的腳本

#MaxThreadsPerHotkey 2

#SingleInstance Force
#installKeybdHook
#Persistent
AppName=MyKeys
Menu, Tray, Tip, %AppName%
Menu, Tray, Icon , Shell32.dll, 45, 1 ; 45, 28, 113, 74, 134
TrayTip, %AppName%, Started, 1 


*a::
GoSub, MyGetKeyStateSub
If (MyGetKeyStateValue=0)
{
    SendInput, a
}
Else
{
    if( MyGetKeyStateValue & 1 > 0) ; Compare first bit
        send {LAlt down}
        send {d down}
        send {LAlt up}
        send {d up}
    if( MyGetKeyStateValue & 10 > 0) ; compare second bit
        MsgBox, RShift
    if( MyGetKeyStateValue & 100 > 0) ; compare third bit
        send {LAlt down}
            send {d down}
        send {LAlt up}
        send {d up}
    if( MyGetKeyStateValue & 1000 > 0)
        MsgBox, RShift
    if( MyGetKeyStateValue & 10000 > 0)
        MsgBox, LAlt
    if( MyGetKeyStateValue & 100000 > 0)
        MsgBox, RAlt
    if( MyGetKeyStateValue & 1000000 > 0)
        MsgBox, LWin
    if( MyGetKeyStateValue & 10000000 > 0)
        MsgBox, RWin
    if ( MyGetKeyStateValue & 00000011 > 0) ; If LCtrl AND LShift pressed
        MsgBox, LCtrl AND LShift
}
Return


MyGetKeyStateSub:
MyGetKeyStateValue:=0
if getkeystate("LCtrl", P)
    MyGetKeyStateValue+=1 ; set least significant bit
if getkeystate("RCtrl", P)
    MyGetKeyStateValue+=2 ; set 2nd least significant bit, etc, etc.
if getkeystate("LShift", P)
    MyGetKeyStateValue+=4
if getkeystate("RShift", P)
    MyGetKeyStateValue+=8
if getkeystate("Lalt", P)
    MyGetKeyStateValue+=16
if getkeystate("Ralt", P)
    MyGetKeyStateValue+=32
if getkeystate("LWin", P)
    MyGetKeyStateValue+=64
if getkeystate("RWin", P)
    MyGetKeyStateValue+=128
Return



*d::
GoSub, MyGetKeyStateSub
If (MyGetKeyStateValue=0)
{
    SendInput, d
}
Else
{
    if( MyGetKeyStateValue = 1) ; LAlt
    {
        SendInput, {LAlt Down}d{LAlt Up}
        Return
    }
    if( MyGetKeyStateValue = 4) ; LWin
    {
        SendInput, {LAlt Down}{LWin Down}d{LAlt Up}{LWin Up}
        Return
    }
}
Return

並打開程序,同樣它不起作用,第一次按 Alt DI 獲取宏,第二次按 D 按住 alt 鍵,我得到一個普通的 D。

我在想你說的相對於 XY 問題的內容,也許我應該將我所有的宏從 HK4(Hot Keyboard Pro 4)重建為 AutoHotkey。 我在 HK4 GUI 的幫助下創建了很多宏,但是宏本身存儲在一個 xml 腳本文件中,我用文本編輯器打開了一次這個文件,它的巨大!,我需要多少時間來編寫腳本AHK 中的所有這些宏?

我已經設置了適用於每個宏(如 200 個宏)的 25 個變量,主要是鼠標移動、鼠標點擊、從應用程序內的浮動窗口復制選定的文本(數值)、對它們應用算術運算並將結果粘貼到相同的再次框(HK4有和播放鍵的選項,因為否則它不能粘貼到應用程序中),運行取決於哪個軟件,哪些浮動窗口名稱以及啟用或禁用哪些變量(反轉條件),也有切換宏(使用一個熱鍵在兩個宏之間切換),我的意思是,我需要多少時間來學習如何在 AHK 中編寫所有這些宏的腳本?,我在互聯網上查看,但很難理解每個發布的案例不完全適用於我打算做的事情,謝謝羅伯特,你有什么建議? 我的意思是,我會在 AHK 中重建我所有的宏,因為在 AHK 中,我不必多次釋放修飾鍵來同時執行一個宏,那么 Autoit 更容易學習呢? 我讀過它有宏記錄器嗎? 謝謝。

這個怎么樣?

:*:a::+a

如果你想使這個花哨,你可以在一個#IfWinActive聲明封裝這當特定應用程序處於活動狀態只能拿到移,否則全部的成為轉移帶來的是所有的時間...

這個怎么樣:

:*:a::
    Send, {Shift Down}a{Shift Up} ; or use the more modern SendInput
Return

這里是一個小例子,你怎么能做到這一點。 不知道這是否符合您的要求。 在這個例子中,我只創造了這個為信一,但你可以通過重復這對其他字母擴展此。

#SingleInstance Force
#installKeybdHook
#Persistent
AppName=MyKeys
Menu, Tray, Tip, %AppName%
Menu, Tray, Icon , Shell32.dll, 45, 1 ; 45, 28, 113, 74, 134
TrayTip, %AppName%, Started, 1 


*a::
GoSub, MyGetKeyStateSub
If (MyGetKeyStateValue=0)
{
    SendInput, a
}
Else
{
    if( MyGetKeyStateValue & 1 > 0) ; Compare first bit
        MsgBox, LCtrl
    if( MyGetKeyStateValue & 10 > 0) ; compare second bit
        MsgBox, RCtrl
    if( MyGetKeyStateValue & 100 > 0) ; compare third bit
        MsgBox, LShift
    if( MyGetKeyStateValue & 1000 > 0)
        MsgBox, RShift
    if( MyGetKeyStateValue & 10000 > 0)
        MsgBox, LAlt
    if( MyGetKeyStateValue & 100000 > 0)
        MsgBox, RAlt
    if( MyGetKeyStateValue & 1000000 > 0)
        MsgBox, LWin
    if( MyGetKeyStateValue & 10000000 > 0)
        MsgBox, RWin
    if ( MyGetKeyStateValue & 00000011 > 0) ; If LCtrl AND LShift pressed
        MsgBox, LCtrl AND LShift
}
Return


MyGetKeyStateSub:
MyGetKeyStateValue:=0
if getkeystate("LCtrl", P)
    MyGetKeyStateValue+=1 ; set least significant bit
if getkeystate("RCtrl", P)
    MyGetKeyStateValue+=2 ; set 2nd least significant bit, etc, etc.
if getkeystate("LShift", P)
    MyGetKeyStateValue+=4
if getkeystate("RShift", P)
    MyGetKeyStateValue+=8
if getkeystate("Lalt", P)
    MyGetKeyStateValue+=16
if getkeystate("Ralt", P)
    MyGetKeyStateValue+=32
if getkeystate("LWin", P)
    MyGetKeyStateValue+=64
if getkeystate("RWin", P)
    MyGetKeyStateValue+=128
Return

Eduard,這是一個在我的情況下似乎工作正常的示例,可能是您的應用程序正在查看被按下的物理鍵。 在這種情況下,我會去看看,你監視你控制窗口的狀態,看是否需要看停止或繼續。 在這個例子中,我離開了子程序出為沒有改變(但你會在這里需要它)。

*d::
GoSub, MyGetKeyStateSub
If (MyGetKeyStateValue=0)
{
    SendInput, d
}
Else
{
    if( MyGetKeyStateValue = 1) ; LCtrl
    {
        ;MsgBox, LCtrl
        SendInput, {LShift Down}d{LShift Up}
        Return
    }
    if( MyGetKeyStateValue = 4) ; LShift
    {
        ;MsgBox, LShift
        SendInput, {LCtrl Down}{LShift Down}d{LShift Up}{LCtrl Up}
        Return
    }
}
Return

只需使用a::A ,保存並運行。 A被解釋為Shift + a ,並將與鍵重新映射一起使用。 這也適用於#IfWinActive#IfWinExist

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM