Windows, F# - 글로벌 핫키 설정

18912 단어 WindowsF#tech

개요


부팅하는 동안 F#을 사용하여 전 세계 핫키를 효과적으로 만드는 작업 트레이 상주형 응용 프로그램을 제작한다.

설치 예


"Windows + Alt + C"를 입력할 때 빈 메시지 상자의 견본을 표시합니다.
open System.Windows.Forms

let createIcon () =
    let toolStripMenuItem = new ToolStripMenuItem(Text = "&終了")
    toolStripMenuItem.Click.Add(fun e -> Application.Exit())

    let contextMenuStrip = new ContextMenuStrip()
    contextMenuStrip.Items.Add toolStripMenuItem |> ignore

    new NotifyIcon(
        Icon = new System.Drawing.Icon @"icon.ico",
        Visible = true,
        Text = "TestApp",
        ContextMenuStrip = contextMenuStrip
    )


open System
open System.Runtime.InteropServices

[<DllImport("user32.dll")>]
extern int RegisterHotKey(IntPtr HWnd, int ID, int MOD_KEY, int KEY)

[<DllImport("user32.dll")>]
extern int UnregisterHotKey(IntPtr HWnd, int ID)


type HotkeyForm () as this =
    inherit Form()

    let icon = createIcon()

    do
        RegisterHotKey(this.Handle, 0x0000, 0x0001 ||| 0x0008, int Keys.C) |> ignore

        Application.ApplicationExit.Add(fun e ->
            UnregisterHotKey(this.Handle, 0x0000) |> ignore
        )

    override this.WndProc m =
        base.WndProc(&m)

        if m.Msg = 0x0312 && int m.WParam = 0x0000 then
            MessageBox.Show("") |> ignore

    interface IDisposable with
        member this.Dispose() =
            icon.Dispose()


do
    use form = new HotkeyForm()
    Application.Run()

해설


System.Windows.Forms


.NET5에서 참조할 수 없는 경우 다음 기사에서 설정 방법을 설명합니다.
https://zenn.dev/shikatan/articles/8f3d768266935c

작업 트레이에 아이콘 표시


open System.Windows.Forms

let createIcon () =

    // アイコンをホバーした時に表示されるメニューの定義

    // - クリックしたらアプリを終了する「終了」ボタンの作成
    let toolStripMenuItem = new ToolStripMenuItem(Text = "&終了")
    toolStripMenuItem.Click.Add(fun e -> Application.Exit())

    // - メニューに「終了」ボタンを追加
    let contextMenuStrip = new ContextMenuStrip()
    contextMenuStrip.Items.Add toolStripMenuItem |> ignore

    // アイコンの生成
    new NotifyIcon(

        // 表示する画像 (.ico)
        Icon = new System.Drawing.Icon @"icon.ico",

        // 表示/非表示
        Visible = true,

        // ホバー時に表示するテキスト (アプリ名など)
        Text = "TestApp",

        // 上で作成したメニューを追加
        ContextMenuStrip = contextMenuStrip
    )

전역 바로 가기 키 설정


// System.Windows.Forms は前の部分で読み込み済み

open System
open System.Runtime.InteropServices


// Windows API

// - ホットキーの登録用
[<DllImport("user32.dll")>]
extern int RegisterHotKey(IntPtr HWnd, int ID, int MOD_KEY, int KEY)

// - ホットキーの解除用
[<DllImport("user32.dll")>]
extern int UnregisterHotKey(IntPtr HWnd, int ID)


type HotkeyForm () as this =
    inherit Form()

    let icon = createIcon()

    do
        // ホットキーを登録する
        RegisterHotKey(this.Handle, 0x0000, 0x0001 ||| 0x0008, int Keys.C) |> ignore

        // アプリ終了時にホットキーを解除する
        Application.ApplicationExit.Add(fun e ->
            UnregisterHotKey(this.Handle, 0x0000) |> ignore
        )

    override this.WndProc m =
        base.WndProc(&m)

	// グローバルホットキーが入力された時の処理

        // && の左辺は固定
        if m.Msg = 0x0312 && int m.WParam = 0x0000 then
            MessageBox.Show("") |> ignore

    interface IDisposable with
        member this.Dispose() =
            icon.Dispose()

바로 가기 키 로그인


RegisterHotKey


https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-registerhotkey
보조 매개변수
전달0x0000~0xbfff 내의 적당한 값.또한 다음 부분은 같은 값을 사용합니다.
  • 해제 시UnregisterHotKey의 두 번째 파라미터
  • WndProcint m.WParam와의 등효판정
  • 제3인자
    수정키Alt,Ctrl,Shift,Windows의 지정.
    여러 상황에서 |||로 격리하다.
    손질 키

    Alt
    0x0001
    Ctrl
    0x0002
    Shift
    0x0004
    Windows
    0x0008
    네 번째 매개변수
    키 코드를 지정합니다.int Keys.キー에서 얻을 수 있다.
    https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.keys?view=net-5.0

    실행


    do
        use form = new HotkeyForm()
    
        // フォームを表示しない場合、引数なしで実行
        Application.Run()
    

    역사를 갱신하다


    일자
    컨텐트
    2021/03/25
    호출 Dispose 의 처리를 추가합니다.

    end

    좋은 웹페이지 즐겨찾기