[Windowsロゴキー]+[何らかのキー]による誤作動が多すぎるので、[Windowsロゴキー]を長押ししなければ[Windowsロゴキー]が機能しないようにした|[Windowsロゴキー]+[何らかのキー]によるショートカットキーは無効になります

■[AutoHotKey]1つのキーで3つの機能!長押しや2度押しに機能を割り当てる

  • Windowsメニューを出す→[Windowsロゴキー]の長押し1回
  • Windowsメニューを消す→[Windowsロゴキー]の長押し1回
LWin::                           ;LWinキーを押した時
KeyWait, LWin, T0.3       ;LWinキーが離されるのを0.3秒待つ
If (ErrorLevel){               ;ErrorLevelが1であれば、
    Send,{LWin}
    KeyWait, LWin            ;LWinが離されるのを待つ
    return
}else{                            ;そうでなければ、
    Send,{Ctrl down}{c}{Ctrl up}
    KeyWait, LWin            ;LWinが離されるのを待つ
    return
}

■【PC操作とデータ整理】キーボードの[キー割当(キーバインド)の変更]と[マウスのクリックをキーボードで代行するソフト]|東プレ・リアルフォースの[テンキーレスモデル]をメインとし、ジェイダブルシステムの[35キー]の[長押し対応品]である[プログラマブルキーボード]を[外付けテンキーとしても使う] · ゆきんこの勉強法

; 2025-05-07 23:09更新
; AutoHotkeyはWindows専用であり、Linux・macOSには非対応である。
; AutoHotkey.exe〔メイン実行ファイル〕とAutoHotkey.ahk〔デフォルトスクリプト〕の
; [AutoHotkey]というファイル名部分をリネームする場合は、
; 実行ファイルとスクリプトのベース名を必ず一致させる必要がある。
; 例:MyScript.exe と MyScript.ahk のように揃える。

; AutoHotkey.exeは、Windowsのログインセッションごとに
; 複数プロセスを起動できるが、
; 同一スクリプトの多重起動はデフォルトで排他制御され、
; 既存プロセスが優先され、新規プロセスは終了される。

; AutoHotkey.ahk〔スクリプトファイル〕は
; 文字コードを[UTF-8 with BOM:必須]、
; 改行コードを[CR+LF(Windows形式):推奨]で保存する。

; ■<a href="https://www.onlinemictest.com/ja/keyboard-test/" target="_blank" rel="nofollow">キーボードテスト – あなたのキーボードをテストしましょう</a><br>
; ●●●[AHK Quick Convertor V2]を使ってコードをコンバートしてある
; ■<a href="https://github.com/mmikeww/AHK-v2-script-converter?tab=readme-ov-file" target="_blank" rel="nofollow">GitHub - mmikeww/AHK-v2-script-converter: AHK v1 -> v2 script converter</a><br>
; 全角/半角|vkF3 または vkF4
; 変換|vk1C
; 無変換|vk1D
; カタカナ/ひらがな/ローマ字|vkF2
; windows|#
; Alt|!
; Ctrl|^
; Shift|+
; 左のモディファイアキーを使用(NT系専用)|<
; 右のモディファイアキーを使用(NT系専用)|>
; AutoHotkey 2.0:空白文字:\s = [ `t`r`n]
; AutoHotkey 2.0:空白文字以外:\S = [^ `t`r`n]

; グローバル変数は、最新のAutoHotkey 2.0以上では、何もしなくても、以下のように宣言するだけで常駐する
; global jpChars := "一-龯ぁ-ゖァ-ヶ0-9A-Za-z!-/:-@[-`{-~ 〜々〆〻「」『』【】《》〈〉“”‘’・…※"
; global Hankaku := "[!-~&&[^.?!]]"
global jpChars := "一-龯ぁ-んァ-ヶーA-Za-z0-9!-/:-@[-`{-~ 々〆〻「」『』【】《》〈〉“”‘’・…※〜"
global hankaku := "!-~"


ScrollLock::Send "^!1"

+Pause::Send "^!3"
Pause::Send ("^!2")

; Shift + Alt + Tを押すと、Ctrl + Alt + 0〔更新時刻取得〕を押したことにする。
+!t::Send "^!0"

; Shift + Alt + Iを押すと、Ctrl + Alt + 1〔更新時刻取得〕を押したことにする。
+!i::Send "^!1"

; Shift + Alt + Cを押すと、Ctrl + Alt + 2〔LibreOffice Calc〕を押したことにする。
+!c::Send "^!2"

; Shift + Alt + Dを押すと、Ctrl + Alt + y〔Hugo実行〕を押したことにする。
+!d::Send "^!y"

; Shift + Alt + Bを押すと、Ctrl + Alt + x〔BunBackup〕を押したことにする。
+!b::Send "^!x"

; Shift + Alt + Gを押すと、Ctrl + Alt + 7〔BlueGriffon〕を押したことにする。
+!g::Send "^!7"

; Shift + Alt + Sを押すと、Ctrl + Alt + 5〔サクラエディタでファイルを開く〕を押したことにする。
+!s::Send "^!5"

; Shift + Ctrl + 7 でバッククォート〔AutoHotkeyのエスケープ文字〕を入力
+^7::Send "{text}``"

; AutoHotkey v2.0で Shift + Alt + M を押した際にサクラエディタでのソートの後にマージする
+!m::
{
    Send "{Ctrl Down}"  ; Ctrlキーを押す
    Send "v"            ; vキーを入力
    Send "a"            ; aキーを入力
    Send "{Ctrl Up}"    ; Ctrlキーを離す
    
    Send "{Alt Down}"   ; Altキーを押す
    Send "a"            ; aキーを入力
    Send "m"            ; mキーを入力
    Send "{Alt Up}"     ; Altキーを離す
    
    Send "{Enter}"      ; Enterキーを入力
    
    Send "{Ctrl Down}"  ; Ctrlキーを押す
    Send "a"            ; aキーを入力
    Send "c"            ; cキーを入力
    Send "{Ctrl Up}"    ; Ctrlキーを離す
}

; ●●●Windowsキー + w キーを同時押ししてWZ Editor 10を起動する
#UseHook	; UseHookをOnにした状態で使用
#w::
{
key := "w"
ErrorLevel := !KeyWait(key, "T0.3")
If(ErrorLevel){	; 長押しした場合
	Run("C:\Program Files (x86)\sakura\sakura.exe C:\Users\" A_UserName "\Documents\note-archive.html")
	ErrorLevel := !KeyWait(key)
	return
	}
ErrorLevel := !KeyWait(key, "D, T0.2")
If(!ErrorLevel){	; 2度押しした場合
	Run("C:\Program Files (x86)\sakura\sakura.exe C:\Users\" A_UserName "\Documents\bookmarkstoday.html")
	ErrorLevel := !KeyWait(key)
	return
}else{	; 短押しした場合
	Run("C:\Program Files\WZ EDITOR 10\wzeditor.exe")
	ErrorLevel := !KeyWait(key)
	return
	}
}

; ●●●Windowsキー + s キーを同時押ししてサクラエディターを起動する
#UseHook	; UseHookをOnにした状態で使用
#s::
{
key := "s"
ErrorLevel := !KeyWait(key, "T0.3")
If(ErrorLevel){	; 長押しした場合
	Run("C:\Program Files (x86)\sakura\sakura.exe C:\Users\" A_UserName "\Documents\note-archive.html")
	ErrorLevel := !KeyWait(key)
	return
	}
ErrorLevel := !KeyWait(key, "D, T0.2")
If(!ErrorLevel){	; 2度押しした場合
	Run("C:\Program Files (x86)\sakura\sakura.exe C:\Users\" A_UserName "\Documents\bookmarkstoday.html")
	ErrorLevel := !KeyWait(key)
	return
}else{	; 短押しした場合
	Run("C:\Program Files (x86)\sakura\sakura.exe")
	ErrorLevel := !KeyWait(key)
	return
	}
}

^Tab::
{
    if (KeyWait("c", "D T0.5") = 0)	; cキーが0.5秒以内に押されないのを待つ
    {
	; cキーが押された場合
        Send "^a"	; すべてを選択
        Send "^v"	; クリップボードの内容を貼り付ける
        Send "{Enter}"	; [Enter]
    }
    else
    {
	; cキーが押されなかった場合
        Send "^a"	; すべてを選択
        Send "^v"	; クリップボードの内容を貼り付ける
    }
}

^+Tab::
{
    if (KeyWait("c", "D T0.5") = 0)	; cキーが0.5秒以内に押されないのを待つ
    {
	; cキーが押された場合
        Send "^a"	; すべてを選択
        Send "^v"	; クリップボードの内容を貼り付ける
    }
    else
    {
	; cキーが押されなかった場合
        Send "^a"	; すべてを選択
        Send "^v"	; クリップボードの内容を貼り付ける
    }
}

; ●●●[Shift]+[Tab]で全選択貼り付け
+Tab::
{
        Send "^a"	; すべてを選択
        Send "^v"	; クリップボードの内容を貼り付ける
}

; ●●●[Alt]+[z]で読点[、]
!z::
{
        Send ","	; 、
        Send "{Space}"	; 変換
        Sleep(80)		; 間をあける
        Send "{Enter}"	; 確定
}

; ●●●[Alt]+[x]で句点[。]
!x::
{
        Send "."	; 、
        Send "{Space}"	; 変換
        Sleep(80)		; 間をあける
        Send "{Enter}"	; 確定
}

; ●●●[Ctrl]+[無変換]で全選択貼り付け
^vk1D::
{
        Send "^a"	; すべてを選択
        Send "^v"	; クリップボードの内容を貼り付ける
}

; ●●●[Alt]+[無変換vk1D]でハイライト箇所のワードでGoogle検索
!vk1D::
{
    Send("^c")
    Sleep(450)
    ClipboardText := A_Clipboard
    if (ClipboardText != "")
    {
        Run("https://www.google.com/search?q=" ClipboardText)
    }
return
}

; ●●●[Alt]+[Space]でハイライト箇所のワードでGoogle検索
!Space::
{
    Send("^c")
    Sleep(450)
    ClipboardText := A_Clipboard
    if (ClipboardText != "")
    {
        Run("https://jp.mercari.com/search?keyword=" ClipboardText)
    }
return
}

; ●●●[無変換vk1D]+[Space]でハイライト箇所のワードでAmazon検索
vk1D & Space::
{
    Send("^c")
    Sleep(450)
    ClipboardText := A_Clipboard
    if (ClipboardText != "")
    {
        Run("https://www.amazon.co.jp/s?k=" ClipboardText)
    }
return
}

; ●●●[無変換vk1D]単独はマウス左クリック
vk1D::
{
    MouseClick("left", , , , , "down")
    KeyWait("vk1D")
    MouseClick("left", , , , , "up")
return
}

; ●●●[Ctrl]+[Back Space]で[ブラウザ戻る]
^Backspace::
{
Send("{Browser_Back}")
return
}

; ●●●[Shift]+[Ctrl]+[Back Space]で[ブラウザ進む]
+^Backspace::
{
Send("{Browser_Forward}")
return
}

; ●●●vk1C 変換キー=クリップボードを数学定義ファイルに追記する
vk1C::  ; 任意のキー割り当て(ここでは vk1C)
{
    Clipwait(2)
    text := A_Clipboard
    if (text != "") {
        filePath := "C:\Drawers\Description\数学定義.md"
        FileAppend("`r`n●●●`r`n" text, filePath, "UTF-8")
        Run('"C:\Program Files\WZ EDITOR 10\wzeditor.exe" "' filePath '"')

        ; WZ EDITOR の起動を待ってからキー操作を送信
        Sleep(400)
        Send("{R}")
        Sleep(400)
        Send("{Ctrl down}{PgDn}{Ctrl up}{End}")
        Sleep(400)
        Send("{Enter}")
        Sleep(400)
        Send("{F2}")
    } else {
        MsgBox("クリップボードにテキストがありません。")
    }
}

; ●●●vkF2 ひらがな/カタカナキー=ドラッグしてハイライトされた文字列を引用する
vkF2::
{
Send("{Ctrl down}{.}{Ctrl up}")
Sleep(250)
Send("{Q}{Q}")
Sleep(250)
Send("{Ctrl down}{a}{c}{Ctrl up}")
Sleep(100)
Send("{Enter}")
Sleep(100)
Send("{Enter}")
return
}

; ●●●AppsKeyの押し方で動作を変える。
; ■<a href="https://pouhon.net/ahk-keywait/2848/" target="_blank" rel="nofollow">[AutoHotKey]1つのキーで3つの機能!長押しや2度押しに機能を割り当てる</a><br>
; ■<a href="https://ameblo.jp/hinatahugu29/entry-12842214165.html" target="_blank" rel="nofollow">【AutoHotKey】今のキーボードに合わせたカスタマイズに向けて【情報収集】 | ふぐのようす</a><br>
#UseHook	; UseHookをOnにした状態で使用
AppsKey::
{
    key := "AppsKey"
    ErrorLevel := !KeyWait(key, "T0.3")
    If (ErrorLevel) {    ; 長押しした場合:MIFES
        Run('C:\Program Files\MIFES11\MIW.exe')
        KeyWait(key)
        return
    }
    
    ErrorLevel := !KeyWait(key, "D, T0.2")
    If (!ErrorLevel) {    ; 2度押しした場合:【旧:短押しの処理】Ctrl+. や GG 送信など
        Send("!p")    ; Alt+P を送信 (確実に戻すためにシンプルに記述)
        Sleep(300)    ; 待て
        
        A_Clipboard := ""
        Send("^a")
        Sleep(50)
        Send("^c")
        if ClipWait(0.5) {
            Send("{Enter}")
        }
        
        KeyWait(key)
        return
    } else {    ; 短押しした場合:【旧:2度押しの処理】Alt+C 送信など
        Send("!c")    ; Alt+C を送信 (確実に戻すためにシンプルに記述)
        Sleep(300)    ; ポップアップの表示を待つ
        
        ; クリップボードを一旦空にしてからコピーを試みる
        A_Clipboard := ""
        Send("^a")    ; 全選択
        Sleep(50)
        Send("^c")    ; コピー
        
        ; クリップボードにデータが入ったか少し待つ(最大0.5秒)
        if ClipWait(0.5) {
            Send("{Enter}")
        }
        
        KeyWait(key)
        return
    }
}

; ●●●
^Up::
{
MouseMove(0, -10, 0, "R")
return
}

; ●●●
^!Up::
{
MouseMove(0, -50, 0, "R")
return
}

; ●●●
^Down::
{
MouseMove(0, 10, 0, "R")
return
}

; ●●●
^!Down::
{
MouseMove(0, 50, 0, "R")
return
}

; ●●●
^Left::
{
MouseMove(-10, 0, 0, "R")
return
}

; ●●●
^!Left::
{
MouseMove(-50, 0, 0, "R")
return
}

; ●●●
^Right::
{
MouseMove(10, 0, 0, "R")
return
}

; ●●●
^!Right::
{
MouseMove(50, 0, 0, "R")
return
}

; ●●●
; ●●●
; ●●●
; ●●●

#Requires AutoHotkey v2.0

; 保持する最大履歴数
global maxHistory := 1000
global historyStack := []
global isInternalAction := false

OnClipboardChange(ClipChanged)

ClipChanged(dataType) {
    global historyStack, isInternalAction
    if (isInternalAction) {
        isInternalAction := false
        return
    }
    if (dataType = 1) {
        text := A_Clipboard
        if (text = "")
            return
        
        ; 直前と同じ内容の連続コピーは重複して積まない
        if (historyStack.Length > 0 && historyStack[historyStack.Length] = text)
            return
            
        historyStack.Push(text)
        if (historyStack.Length > maxHistory)
            historyStack.RemoveAt(1)
    }
}

; [Win + V] : スタックから最新のテキストを取り出して貼り付け(ポップ)
#v:: {
    global historyStack, isInternalAction
    if (historyStack.Length > 0) {
        isInternalAction := true
        A_Clipboard := historyStack.Pop()
        Sleep(50)
        Send("^v")
    } else {
        ToolTip("履歴がありません")
        SetTimer(() => ToolTip(), -1000)
    }
}

; [Win + Shift + V] : 現在蓄積されている履歴の一覧を確認する
#+v:: {
    global historyStack
    if (historyStack.Length = 0) {
        ToolTip("履歴は空です")
        SetTimer(() => ToolTip(), -1000)
        return
    }
    
    listStr := "--- クリップボード履歴 (LIFO) ---\n"
    Loop historyStack.Length {
        idx := historyStack.Length - A_Index + 1
        item := historyStack[idx]
        if (StrLen(item) > 30)
            item := SubStr(item, 1, 30) . "..."
        listStr .= idx ": " . item . "\n"
    }
    ToolTip(listStr)
    SetTimer(() => ToolTip(), -4000)
}

; [Win + C] : 選択中のテキストを「現在のクリップボードを維持したまま」テキストスタックに追加
#c:: {
    global historyStack, maxHistory
    
    ; 1. 現在のクリップボード内容を一時退避
    oldClip := A_Clipboard
    A_Clipboard := ""
    
    ; 2. 選択部分を一時的にコピー
    Send("^c")
    
    ; 3. クリップボードにデータが入るのを待つ (最大0.5秒)
    if ClipWait(0.5) {
        selectedText := A_Clipboard
        
        ; 4. クリップボードを元の状態に即座に戻す
        A_Clipboard := oldClip
        
        if (selectedText != "") {
            ; 連続重複チェック
            if (historyStack.Length > 0 && historyStack[historyStack.Length] = selectedText) {
                ToolTip("直前と同じテキストです")
            } else {
                historyStack.Push(selectedText)
                if (historyStack.Length > maxHistory)
                    historyStack.RemoveAt(1)
                
                ; 追加されたことを短いツールチップで通知
                preview := StrLen(selectedText) > 20 ? SubStr(selectedText, 1, 20) . "..." : selectedText
                ToolTip("スタックに追加: " . preview)
            }
            SetTimer(() => ToolTip(), -1500)
        }
    } else {
        ; コピー失敗時は元に戻す
        A_Clipboard := oldClip
        ToolTip("テキストが選択されていません")
        SetTimer(() => ToolTip(), -1000)
    }
}


■「AutoHotKey」による作業効率化~その1~基本:That’s Done! - ブロマガ
■「AutoHotKey」による作業効率化~その2~実践:That’s Done! - ブロマガ
■AutoHotkeyを利用してマウスとお別れする | NETWIZ.JP

◀
 
▶

↑