-
Notifications
You must be signed in to change notification settings - Fork 9
Open
Description
目前切换窗口焦点输入法不会消失,且不能上屏....
只能按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)
}
}
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels