Autohotkeyを使用したWindowsのカスタムショートカット

Windows( 1、2 )およびLinuxのショートカットに関する最近の出版物とそうではない出版物の追跡に従って、 Autohotkeyプログラム(Windowsのみ、 インストーラーポータブル(zip)バージョン )を使用して、独自のキーボードショートカットを設定する方法について書くことにしましたデフォルトでシステムにショートカットが提供されていないコマンド。 多くの点で、WindowsでMacと同じショートカットを使用したいという欲求が、私が一度に多くの時間を費やしたことで、この役割を果たしました。



Autohotkeyは単なるホットキーマネージャーではなく、Windowsを操作するための本当に普遍的なツールであり、カスタムショートカットの実装が解決に役立つ唯一のタスクではありません( 英語ロシア語の ドキュメント )。 Autohotkeyは独自のスクリプト言語を使用しますが、これは非常にシンプルであり、プロのプログラマーにとっては、完全に初歩的なものだと思います。 AHK言語で書かれた多くのスクリプトは、アプリケーション全体(バッチ名前変更、コードエディター、Web開発用ツールなど)を含むプログラムフォーラムで公開されています。



さまざまなタイプのショートカットを使用できます:通常のキーボードショートカット、マウスを使用するショートカット(ボタンとホイール)、ダブルクリックと異なるマウスボタンを組み合わせたクリック、ダブル/トリプルキーストローク、修飾子自体(Ctrl、Altなど)、ジョイスティックボタンなど さらに、特定のアプリケーションでのみショートカットを機能させることができます。これにより、変更する方法がないプログラムで「間違っている」と思われるショートカットを修正するためのスペースが開きます(Windows Media Playerの例を参照)。



他の同様のプログラムを実行できるコマンドをここには含めませんでした(たとえば、機能は制限されますが、ほとんどメモリを消費しないHoekey-約2-7 Mbを消費するAutohotkeyとは異なり、約100-500 Kb)。 ホットキーでコントロールパネルを開いたり、現在のスクリーンセーバーを起動したりできるシステムコマンドを含む。 その場合は、別のトピックで関連する例をレイアウトできます。 レイアウトを変更し、テキストをあるレイアウトから別のレイアウトに変換するためのかけがえのないスクリプトはAutohotkeyフォーラムの同志wOxxOmによって書かれました。 AutohotkeyはVistaでも動作しますが、すべてのスクリプトはWinXPで動作し、テストされますが、その下のすべてのサンプルのパフォーマンスを保証することはできません。



以下は、略語、それに割り当てられたコマンド、およびAutohotkey.iniファイルに挿入する必要がある対応するコードです。 そして、もちろん、すべてのショートカットを好みに合わせて変更できます。 スクリプトの一部を二重コロンに変更するだけです。



Shift + Alt + Backspaceでバスケットを空にします

+!Backspace:: FileRecycleEmpty









Ctrl + Qでウィンドウを閉じます(Linuxなど)

$^q::

IfWinActive ahk_class WMPlayerApp

PostMessage, 0x10

else

WinClose, A

return









Ctrl + Win +マウスホイールでウィンドウを最小化/最大化

^#WheelUp:: WinMaximize A

^#WheelDown:: WinRestore A









Win + Shift + C-エクスプローラーで選択したファイルへのパスをクリップボードにコピーします

#+c::

clipboard =

Send, ^c

ClipWait, 2

Sort, clipboard









チルダ( `)を押して、ウィンドウをタイトルバーに切り替えます

ws_MinHeight = 25



OnExit, ExitSub

return



`::

Sleep, 200

WinGet, ws_ID, ID, A

Loop, Parse, ws_IDList, |

{

IfEqual, A_LoopField, %ws_ID%

{

StringTrimRight, ws_Height, ws_Window%ws_ID%, 0

WinMove, ahk_id %ws_ID%,,,,, %ws_Height%

WinSet, AlwaysOnTop, off, A

StringReplace, ws_IDList, ws_IDList, |%ws_ID%

return

}

}

WinGetPos,,,, ws_Height, A

WinSet, AlwaysOnTop, on, ahk_id %ws_ID%

ws_Window%ws_ID% = %ws_Height%

WinMove, ahk_id %ws_ID%,,,,, %ws_MinHeight%

ws_IDList = %ws_IDList%|%ws_ID%

return



ExitSub:

Loop, Parse, ws_IDList, |

{

if A_LoopField = ; First field in list is normally blank.

continue ; So skip it.

StringTrimRight, ws_Height, ws_Window%A_LoopField%, 0

WinMove, ahk_id %A_LoopField%,,,,, %ws_Height%

}

ExitApp









Winキー (またはその他)を押したままウィンドウを移動します

#LButton::

CoordMode, Mouse

MouseGetPos, EWD_MouseStartX, EWD_MouseStartY, EWD_MouseWin

WinGetClass, EWD_Win_Class, ahk_id %EWD_MouseWin%

If EWD_Win_Class = ProgMan

Return

WinGet, State, MinMax, ahk_id %EWD_MouseWin%

If State = 1

{

SplashImage,, W160 H27 B1 FM8 WM400 CT000080,, ,, Calibri

SetTimer, Remove_Splash, 600

Return



Remove_Splash:

SetTimer, Remove_Splash, Off

SplashImage, Off

Return

}

WinGetPos, EWD_OriginalPosX, EWD_OriginalPosY,,, ahk_id %EWD_MouseWin%

SetTimer, EWD_WatchMouse, 10

Return



EWD_WatchMouse:

EWD_Work = 1

GetKeyState, EWD_LButtonState, LButton, P

If EWD_LButtonState = U

{

SetTimer, EWD_WatchMouse, off

EWD_Work =

Return

}

GetKeyState, EWD_EscapeState, Escape, P

If EWD_EscapeState = D

{

SetTimer, EWD_WatchMouse, off

EWD_Work =

WinMove, ahk_id %EWD_MouseWin%,, %EWD_OriginalPosX%, %EWD_OriginalPosY%

Return

}

CoordMode, Mouse

MouseGetPos, EWD_MouseX, EWD_MouseY

WinGetPos, EWD_WinX, EWD_WinY,,, ahk_id %EWD_MouseWin%

SetWinDelay, -1

WinMove, ahk_id %EWD_MouseWin%,, EWD_WinX + EWD_MouseX - EWD_MouseStartX, EWD_WinY + EWD_MouseY - EWD_MouseStartY

EWD_MouseStartX := EWD_MouseX

EWD_MouseStartY := EWD_MouseY

Return









Winを押しながらマウス右ボタンでウィンドウのサイズを変更する

LWin & RButton::

CoordMode, Mouse ; Switch to screen/absolute coordinates.

MouseGetPos, SWM_MouseStartX, SWM_MouseStartY, SWM_MouseWin

WinGetPos, SWM_WinX, SWM_WinY, SWM_WinW, SWM_WinH, ahk_id %SWM_MouseWin%

WinGetClass, SWM_Win_Class, ahk_id %SWM_MouseWin%

If SWM_Win_Class = ProgMan

Return

WinGet, State, MinMax, ahk_id %SWM_MouseWin%

If State = 1

{

SplashImage,, W160 H26 B1 FM8 WM400 CT000080,, ,, Calibri

SetTimer, Remove_Splash, 600

Return

}

GetKeyState, SMW_LCtrlState, LCtrl

if SMW_LCtrlState=D

{

WinClose, ahk_id %SWM_MouseWin%

return

}

SWM_ResizeTypeX=0

SWM_ResizeTypeY=0

if (SWM_MouseStartX < SWM_WinX+SWM_WinW/2)

SWM_ResizeTypeX=1

if (SWM_MouseStartY < SWM_WinY+SWM_WinH/2)

SWM_ResizeTypeY=1

SetTimer, SWM_WatchMouse_Resize, 10

return



SWM_WatchMouse_Move:

GetKeyState, SMW_LButtonState, LButton, P

if SMW_LButtonState = U

{

SetTimer, SWM_WatchMouse_Move, off

return

}

Gosub SWM_GetMouseAndWindowPos

SWM_WinX += %SWM_DeltaX%

SWM_WinY += %SWM_DeltaY%

SetWinDelay, -1

WinMove, ahk_id %SWM_MouseWin%,, %SWM_WinX%, %SWM_WinY%

return



SWM_WatchMouse_Resize:

GetKeyState, SMW_RButtonState, RButton, P

if SMW_RButtonState = U

{

SetTimer, SWM_WatchMouse_Resize, off

return

}

Gosub SWM_GetMouseAndWindowPos

if SWM_ResizeTypeX

{

SWM_WinX += %SWM_DeltaX%

SWM_WinW -= %SWM_DeltaX%

}

else

SWM_WinW += %SWM_DeltaX%

if SWM_ResizeTypeY

{

SWM_WinY += %SWM_DeltaY%

SWM_WinH -= %SWM_DeltaY%

}

else

SWM_WinH += %SWM_DeltaY%

SetWinDelay, -1

WinMove, ahk_id %SWM_MouseWin%,, %SWM_WinX%, %SWM_WinY%, %SWM_WinW%, %SWM_WinH%

return



SWM_GetMouseAndWindowPos:

CoordMode, Mouse

MouseGetPos, SWM_MouseX, SWM_MouseY

SWM_DeltaX = %SWM_MouseX%

SWM_DeltaX -= %SWM_MouseStartX%

SWM_DeltaY = %SWM_MouseY%

SWM_DeltaY -= %SWM_MouseStartY%

SWM_MouseStartX = %SWM_MouseX%

SWM_MouseStartY = %SWM_MouseY%

WinGetPos, SWM_WinX, SWM_WinY, SWM_WinW, SWM_WinH, ahk_id %SWM_MouseWin%

return









Alt + H-エクスプローラーで隠しファイルを表示/非表示

!H::GoSub,CheckActiveWindow



CheckActiveWindow:

ID := WinExist("A")

WinGetClass,Class, ahk_id %ID%

WClasses := "CabinetWClass ExploreWClass"

IfInString, WClasses, %Class%

GoSub, Toggle_HiddenFiles_Display

Return



Toggle_HiddenFiles_Display:

RootKey = HKEY_CURRENT_USER

SubKey = Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced



RegRead, HiddenFiles_Status, % RootKey, % SubKey, Hidden



if HiddenFiles_Status = 2

RegWrite, REG_DWORD, % RootKey, % SubKey, Hidden, 1

else

RegWrite, REG_DWORD, % RootKey, % SubKey, Hidden, 2

PostMessage, 0x111, 28931,,, ahk_id %ID%

Return









エクスプローラーで中マウスボタンをクリックして、ディレクトリに移動します

~MButton::

MouseGetPos,,,,hovercontrol

if hovercontrol = SysListView321

Send {Backspace}

else if hovercontrol = #327701

Send {Backspace}

Return









ウィンドウ内の空のスペースをダブルクリックして、エクスプローラーで新しいフォルダーを作成します

#IfWinActive ahk_class CabinetWClass

~LButton::

SetKeyDelay, , 50

MouseGetPos, , , , ctrl

ControlGet, sel, List, Count Selected, SysListView321, A

If DllCall("GetDoubleClickTime") > A_TimeSincePriorHotkey

and A_ThisHotkey = A_PriorHotkey

and ctrl = "SysListView321"

and sel = 0

SendEvent, !fwf

Return

#IfWinActive









ウィンドウの透明度を変更Ctrl + Shift +マウスホイール

OnExit EXIT

^+WheelDown::

^+WheelUp::

Sleep 50

MouseGetPos cx, cy, Win_Id

WinGetClass Class, ahk_id %Win_Id%

If Class in Progman,Shell_TrayWnd

Return

IfEqual N%Win_Id%,, {

WinGet T, Transparent, ahk_id %Win_Id%

IfEqual T,, SetEnv T,255

List = %List%%Win_Id%,%T%,

N%Win_Id% = %T%

}

IfEqual A_ThisHotKey,^+WheelUp, EnvAdd N%Win_Id%,12

Else N%Win_Id% -= 12 ;Transparency changing step

IfGreater N%Win_Id%,255, SetEnv N%Win_Id%,255

IfLess N%Win_Id%,40, SetEnv N%Win_Id%,40

WinSet Transparent, % N%Win_Id%, ahk_id %Win_Id%

TrayTip,,% "Transparency: " N%Win_Id%

Return



EXIT:

Loop Parse, List, `,

If (A_Index & 1)

Id = %A_LoopField%

Else

Winset Transparent, %A_LoopField%, ahk_id %Id%

ExitApp









タスクバー領域のウィンドウを閉じるCtrl +中マウスボタン

^MButton::

SetBatchLines, -1

CoordMode, Mouse, Screen

SetMouseDelay, -1

SetKeyDelay, -1

MouseGetPos, ClickX, ClickY, WindowUnderMouseID

WinActivate, ahk_id %WindowUnderMouseID%



; WM_NCHITTEST

SendMessage, 0x84,, ( ClickY << 16 )|ClickX,, ahk_id %WindowUnderMouseID%

WM_NCHITTEST_Result =%ErrorLevel%

/*

#define HTERROR (-2)

#define HTTRANSPARENT (-1)

#define HTNOWHERE 0

#define HTCLIENT 1

#define HTCAPTION 2

#define HTSYSMENU 3

#define HTGROWBOX 4

#define HTSIZE HTGROWBOX

#define HTMENU 5

#define HTHSCROLL 6

#define HTVSCROLL 7

#define HTMINBUTTON 8

#define HTMAXBUTTON 9

#define HTLEFT 10

#define HTRIGHT 11

#define HTTOP 12

#define HTTOPLEFT 13

#define HTTOPRIGHT 14

#define HTBOTTOM 15

#define HTBOTTOMLEFT 16

#define HTBOTTOMRIGHT 17

#define HTBORDER 18

#define HTREDUCE HTMINBUTTON

#define HTZOOM HTMAXBUTTON

#define HTSIZEFIRST HTLEFT

#define HTSIZELAST HTBOTTOMRIGHT

#if(WINVER >= 0x0400)

#define HTOBJECT 19

#define HTCLOSE 20

#define HTHELP 21

*/



;Close window with titlebar click

If WM_NCHITTEST_Result in 2,3,8,9,20,21

{

PostMessage, 0x112, 0xF060,,, ahk_id %WindowUnderMouseID% ; 0x112 = WM_SYSCOMMAND, 0xF060 = SC_CLOSE

Return

}



;Close taskbar program click

IfWinActive, ahk_class Shell_TrayWnd

{

MouseClick, Right, %ClickX%, %ClickY%

Sleep, 50

Send, c

WinWaitNotActive, ahk_class Shell_TrayWnd,, 0.5

If ErrorLevel =1

Send, !{Tab}

Return

}



If GetKeyState("MButton", "P")

MouseClick, Middle, %ClickX%, %ClickY%,, Down

Else

MouseClick, Middle, %ClickX%, %ClickY%

Return









Win +数字キーを使用してエクスプローラーでフォルダーの外観を変更する

#1::PostMessage, 0x111, 28717,,, ahk_class CabinetWClass ;

+#1::PostMessage, 0x111, 28719,,, ahk_class CabinetWClass ;

#2::PostMessage, 0x111, 28718,,, ahk_class CabinetWClass ;

#3::PostMessage, 0x111, 28715,,, ahk_class CabinetWClass ;

#4::PostMessage, 0x111, 28716,,, ahk_class CabinetWClass ;









Win +マウスホイールを使用してシステムの音量を変更する

#WheelUp::

SoundSet +5

SoundSet, +5, wave

return



#WheelDown::

SoundSet -5

SoundSet, -5, wave

return









スクロールロック -選択したテキストのレイアウトを変更します

 $~ScrollLock::RecodeTextENRU() RecodeTextENRU() { StringCaseSense On AutoTrim,Off clipSave:=clipAnsi() send ^{Insert} sleep,50 dest= text:=clipAnsi() StringCaseSense,On prevCharToEN=0 ;  RUtoEN=F<DULT:PBQRKVYJGHCNEA{WXIO}SM">Zf,dult;pbqrkvyjghcnea[wxio]sm'.z RUtoSP1=.,/"№;:? RUtoSP2=[];',.{}:"<>/?|@#$^& ;" ABCDEFGHIJKLMNOPQRSTUVWXYZ ENtoRU= loop,parse,text { destChar=%A_LoopField% ; check explicit (non punctuations) ranges ifGreaterOrEqual,A_LoopField, prevCharToEN=1 else if A_LoopField between A and Z prevCharToEN=0 else if A_LoopField between a and z prevCharToEN=0 ; to Russian ifEqual,prevCharToEN,0 { StringGetPos,i,RUtoEN,%A_LoopField% ifEqual,ErrorLevel,0 Transform,destChar,chr,% i + 0xC0 else { StringGetPos,i,RUtoSP2,%A_LoopField% ifEqual,ErrorLevel,0 StringMid,destChar,RUtoSP1,% i+1, 1 } } ; to English because nothing changed ifEqual,destChar,%A_LoopField% { StringGetPos,i,ENtoRU,%A_LoopField% ifEqual,ErrorLevel,0 Transform,destChar,chr,% i + (i>=26 ? 71 : 65) else ; check .,;':"[]{} { StringGetPos,i,RUtoSP1,%A_LoopField% ifEqual,ErrorLevel,0,StringMid,destChar,RUtoSP2,% i+1, 1 } ifNotEqual,destChar,%A_LoopField% prevCharToEN=1 } dest=%dest%%destChar% } ; decide compatibility of unicode clipboard WinGetClass,cls,A if cls in TMsgEditor,wndclass_desked_gsk { ControlGetFocus,cls,A ifInString,cls,TXTRichEdit clipSetUnicode(dest) else Clipboard=%dest% } else clipSetUnicode(dest) sleep,50 send +{Insert} sleep 50 clipSetUnicode(clipSave) LangSwitch() } ; read unicode clipboard into ansi string clipAnsi() { StringLen,L,Clipboard L:=(L+1)*4 transform,ca_Clip,unicode varSetCapacity(ca_WideText,L,0) varSetCapacity(ca_AnsiText,L,0) ; Convert UTF-8 to UTF-16. CP_UTF8=65001 if dllCall("MultiByteToWideChar",uint,65001, uint,0, str,ca_Clip , uint,-1, str,ca_WideText, uint,L/2) dllCall("WideCharToMultiByte",uint,0, uint,0, str,ca_WideText , uint,-1, str,ca_AnsiText, uint,L/2, uint,0, uint,0) ; Convert UTF-16 to ANSI. CP_ACP=0 return ca_AnsiText } ;-------------------------------------------------------------- ; copy ansi string to clipboard in unicode mode clipSetUnicode(cu_AnsiText) { StringLen,L,cu_AnsiText L:=(L+1)*4 varSetCapacity(cu_WideText,L,0) varSetCapacity(cu_UTFtext,L,0) ; ANSI to UTF-16. CP_ACP=0 if dllCall("MultiByteToWideChar",uint,0, uint,0, str,cu_AnsiText , uint,-1, str,cu_WideText, uint,L/2) dllCall("WideCharToMultiByte",uint,65001, uint,0, str,cu_WideText , uint,-1, str,cu_UTFtext, uint,L/2, uint,0, uint,0) ; Convert UTF-16 to UTF-8. CP_UTF8=65001 transform,clipboard,unicode,%cu_UTFtext% }
      
      







右のCtrlキーを押して現在のレイアウトを変更します

$~RControl::LangSwitch(1)

$~RControl up::LangSwitch(2)



LangSwitch( iKeyDownUp=0 )

{

static tickLast

IfEqual,iKeyDownUp,1

{ tickLast=%A_TickCount%

return

}

IfEqual,iKeyDownUp,2

If( A_TickCount-tickLast>200 )

return



HKL:=DllCall("GetKeyboardLayout", "uint",GetThreadOfWindow(), "uint")



HKLnum:=DllCall("GetKeyboardLayoutList","uint",0,"uint",0)

VarSetCapacity( HKLlist, HKLnum*4, 0 )

DllCall("GetKeyboardLayoutList","uint",HKLnum,"uint",&HKLlist)

loop,%HKLnum%

{ if( NumGet( HKLlist, (A_Index-1)*4 ) = HKL )

{ HKL:=NumGet( HKLlist, mod(A_Index,HKLnum)*4 )

break

}

}

ControlGetFocus,ctl,A

SendMessage,0x50,0,HKL,%ctl%,A ;WM_INPUTLANGCHANGEREQUEST



;show traytip

LOCALE_SENGLANGUAGE=0x1001

LOCALE_SENGCOUNTRY=0x1002

VarSetCapacity( sKbd, 260, 0 )

VarSetCapacity( sCountry, 260, 0 )

DllCall("GetLocaleInfo","uint",HKL>>16,"uint",LOCALE_SENGLANGUAGE, "str",sKbd, "uint",260)

DllCall("GetLocaleInfo","uint",HKL & 0xFFFF,"uint",LOCALE_SENGCOUNTRY, "str",sCountry, "uint",260)

traytip,%sKbd%,%sCountry%

SetTimer,REMOVE_TOOLTIP,500 ;0.5 second

return

REMOVE_TOOLTIP:

SetTimer,REMOVE_TOOLTIP,off

traytip

return

}



;returns first thread for the ;sets optional to pipe | separated thread list for the GetProcessThreadOrList( processID, byRef list="" )

{

;THREADENTRY32 {

THREADENTRY32_dwSize=0 ; DWORD

THREADENTRY32_cntUsage = 4 ;DWORD

THREADENTRY32_th32ThreadID = 8 ;DWORD

THREADENTRY32_th32OwnerProcessID = 12 ;DWORD

THREADENTRY32_tpBasePri = 16 ;LONG

THREADENTRY32_tpDeltaPri = 20 ;LONG

THREADENTRY32_dwFlags = 24 ;DWORD

THREADENTRY32_SIZEOF = 28



TH32CS_SNAPTHREAD=4



hProcessSnap := DllCall("CreateToolhelp32Snapshot","uint",TH32CS_SNAPTHREAD, "uint",0)

ifEqual,hProcessSnap,-1, return



VarSetCapacity( thE, THREADENTRY32_SIZEOF, 0 )

NumPut( THREADENTRY32_SIZEOF, thE )



ret=-1



if( DllCall("Thread32First","uint",hProcessSnap, "uint",&thE ))

loop

{

if( NumGet( thE ) >= THREADENTRY32_th32OwnerProcessID + 4)

if( NumGet( thE, THREADENTRY32_th32OwnerProcessID ) = processID )

{ th := NumGet( thE, THREADENTRY32_th32ThreadID )

IfEqual,ret,-1

ret:=th

list .= th "|"

}

NumPut( THREADENTRY32_SIZEOF, thE )

if( DllCall("Thread32Next","uint",hProcessSnap, "uint",&thE )=0)

break

}



DllCall("CloseHandle","uint",hProcessSnap)

StringTrimRight,list,list,1

return ret

}



; Returns thread owning specified window handle

; default = Active window

GetThreadOfWindow( hWnd=0 )

{

IfEqual,hWnd,0

hWnd:=WinExist("A")

DllCall("GetWindowThreadProcessId", "uint",hWnd, "uintp",id)

GetProcessThreadOrList( id, threads )

IfEqual,threads,

return 0

CB:=RegisterCallback("GetThreadOfWindowCallBack","Fast")

lRet=0

lParam:=hWnd

loop,parse,threads,|

{ NumPut( hWnd, lParam )

DllCall("EnumThreadWindows", "uint",A_LoopField, "uint",CB, "uint",&lParam)

if( NumGet( lParam )=true )

{ lRet:=A_LoopField

break

}

}

DllCall("GlobalFree", "uint", CB)

return lRet

}



GetThreadOfWindowCallBack( hWnd, lParam )

{

IfNotEqual,hWnd,% NumGet( 0+lParam )

return true

NumPut( true, 0+lParam )

return 0

}





Ctrl+Shift+Win+Escape/Ctrl+Shift+Win+Alt+Escape - /

#+^Escape:: ;shutdown timer

InputBox, minutes ,Sleeptimer, Put the minutes before shutdown below:,,200,140

if ErrorLevel

exit

else

Sleep, (minutes*60*1000)

Shutdown, 8

return



#+!^Escape:: ;restart timer

InputBox, minutes ,Sleeptimer, Put the minutes before restart below:,,200,140

if ErrorLevel

exit

else

Sleep, (minutes*60*1000)

Shutdown, 2

return









Windows Media Player Space ( )

~Space::

IfWinActive, ahk_class WMPTransition

{

PostMessage, 0x111, 32808, 0, , Windows Media Player

}

IfWinActive, ahk_class WMPlayerApp

{

PostMessage, 0x111, 32808, 0, , Windows Media Player

}

return


















All Articles