Skip to content

我想实现切换焦点关闭输入窗口,但怎么样重置rime的输入状态? #26

@vvyoko

Description

@vvyoko

目前切换窗口焦点输入法不会消失,且不能上屏....
只能按ESC关闭再重新输入

于是我想自己来实现这个
目前我窗口隐藏了...
但是输入状态仍然保留着...

我甚至想手动发送esc键来取消...
但好像不管用(不知道是不接受脚本快捷键还是啥),这的确不是一个好办法于是我放弃了

于是我想请教怎么样正确的重置输入状态?

; https://learn.microsoft.com/zh-cn/windows/win32/winauto/event-constants
EVENT_SYSTEM_FOREGROUND := "0x0003" ;前景窗口已更改
EVENT_OBJECT_FOCUS := "0x8005" ;对象已接收键盘焦点


WINEVENT_OUTOFCONTEXT := 0x0000 ;默认值。 回调函数在 Hook 进程之外的一个 单独线程 中被调用。这是最常用的模式。
WINEVENT_INCONTEXT := 0x0001  ;回调函数 注入 到事件发生所在的进程的 线程 中执行。这速度更快,但需要 Hook 进程和目标进程的位数匹配。
WINEVENT_SKIPOWNPROCESS := 0x0002 ;阻止 Hook 函数接收来自 Hook 进程本身 的事件。
WINEVENT_SKIPOWNTHREAD := 0x0004 ;阻止 Hook 函数接收来自 Hook 进程的线程 的事件。

class Hook
{
    static RegisterHook()
    {
        local cb := CallbackCreate(WinEventHandler)
        this.hHook := DllCall("user32\SetWinEventHook",
            "uint", EVENT_SYSTEM_FOREGROUND,      ; eventMin (EVENT_OBJECT_DESTROY)
            "uint", EVENT_SYSTEM_FOREGROUND,      ; eventMax
            "ptr", 0,            ; hmodWinEventProc (不用模块)
            "ptr", cb, ; lpfnWinEventProc (回调函数地址)
            "uint", 0,           ; idProcess (0 = 所有进程)
            "uint", 0,           ; idThread (0 = 所有线程)
            "uint", WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS)      ; dwFlags

        OnExit((*) => this.UnregisterHook())

        WinEventHandler(hHook, event, hwnd, idObject, idChild, dwmsEventTime)
        {
            switch event {
                case EVENT_SYSTEM_FOREGROUND:
                    if !CandidateBox.isHidden
                    {
                        ; Send("{Esc}")
                        ; Send("{Escape}")

                        box.hide()

                        ; if status := rime.get_status(session_id)
                        ;     rime.free_status(status)
                        ; if commit := rime.get_commit(session_id)
                        ;     rime.free_commit(commit)
                        ; if context := rime.get_context(session_id)
                        ;     rime.free_context(context)
                    }
                default:
            }

        }
    }

    static UnregisterHook()
    {
        DllCall("user32\UnhookWinEvent", "ptr", this.hHook)
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions