天天看点

javaGUI 禁用输入法javaGUI 禁用输入法

javaGUI 禁用输入法

仅适用于windows系统

pom.xml

<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>5.2.0</version>
</dependency>
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna-platform</artifactId>
    <version>5.2.0</version>
</dependency>
           

code

@file:JvmName("WindowsImm32Util")

import com.sun.jna.Library
import com.sun.jna.Native
import com.sun.jna.platform.win32.User32
import com.sun.jna.platform.win32.WinDef
import com.sun.jna.platform.win32.WinNT

/**
 * @author lhDream
 * @Date 2022-7-30 15:53:44
 */
class WindowsImm32Util {

    interface Imm32 :Library{
        fun ImmGetContext(hwnd: WinDef.HWND): WinNT.HANDLE?

        fun ImmAssociateContext(hwnd: WinDef.HWND, himc: WinNT.HANDLE?): WinNT.HANDLE?

        fun ImmReleaseContext(hwnd: WinDef.HWND, himc: WinNT.HANDLE): Boolean

        fun ImmCreateContext(): WinNT.HANDLE?

        fun ImmDestroyContext(himc: WinNT.HANDLE): Boolean
    }

    companion object{
        private var imm32: Imm32? = null
        private val user32 = User32.INSTANCE
        private var status = true

        init {
            imm32 = Native.load("imm32",Imm32::class.java)
        }

        /**
         * 打开输入法
         */
        @JvmStatic
        fun open() {
            if (status) {
                return
            }
            status = true
            val hwnd = user32.GetForegroundWindow()
            var himc = imm32?.ImmGetContext(hwnd)
            himc?.let { himc = imm32?.ImmCreateContext() }
            himc?.let {
                imm32?.ImmAssociateContext(hwnd, it)
                imm32?.ImmReleaseContext(hwnd, it)
            }
        }

        /**
         * 关闭输入法
         */
        @JvmStatic
        internal fun close() {
            if (!status) {
                return
            }
            status = false
            val hwnd = user32.GetForegroundWindow()
            val himc = imm32?.ImmAssociateContext(hwnd, null)
            if (himc != null) {
                imm32?.ImmDestroyContext(himc)
            }
            himc?.let { imm32?.ImmReleaseContext(hwnd, it) }
        }
    }
}