1use bitflags::bitflags;
2use windows_sys::Win32::{
3 Foundation::HWND,
4 UI::Input::{
5 Ime::{
6 ImmGetContext, ImmGetConversionStatus, ImmGetOpenStatus, ImmReleaseContext,
7 ImmSetConversionStatus, ImmSetOpenStatus,
8 },
9 KeyboardAndMouse::GetFocus,
10 },
11};
12
13pub type ImeState = bool;
15
16pub fn get_window_ime_state(hwnd: HWND) -> ImeState {
20 let himc = unsafe { ImmGetContext(hwnd) };
21 if himc.is_null() {
22 return false;
23 }
24
25 let f_open = unsafe { ImmGetOpenStatus(himc) } != 0;
26 unsafe { ImmReleaseContext(hwnd, himc) };
27
28 f_open
29}
30
31pub fn get_ime_state() -> ImeState {
33 let hwnd = unsafe { GetFocus() };
34 get_window_ime_state(hwnd)
35}
36
37pub fn set_window_ime_state(hwnd: HWND, state: ImeState) {
41 let himc = unsafe { ImmGetContext(hwnd) };
42 if himc.is_null() {
43 return;
44 }
45
46 let fopen = unsafe { ImmGetOpenStatus(himc) } != 0;
47
48 if fopen != state {
50 unsafe { ImmSetOpenStatus(himc, state as _) };
51 }
52
53 unsafe { ImmReleaseContext(hwnd, himc) };
54}
55
56pub fn set_ime_state(state: ImeState) {
58 let hwnd = unsafe { GetFocus() };
59 set_window_ime_state(hwnd, state);
60}
61
62#[derive(Clone, Copy, PartialEq, Eq, Debug)]
66pub struct ImeConversionMode(u32);
67
68bitflags! {
69 impl ImeConversionMode: u32 {
70 const ALPHANUMERIC = 0x0000;
72 const CHARCODE = 0x0001;
74 const EUDC = 0x0002;
76 const FIXED = 0x0004;
78 const FULLSHAPE = 0x0008;
80 const HANJACONVERT = 0x0010;
82 const KATAKANA = 0x0020;
84 const NATIVE = 0x0040;
86 const NOCONVERSION = 0x0080;
88 const ROMAN = 0x0100;
90 const SOFTKBD = 0x0200;
92 const SYMBOL = 0x0400;
94 }
95}
96
97pub fn get_window_ime_conversion_mode(hwnd: HWND) -> ImeConversionMode {
101 let himc = unsafe { ImmGetContext(hwnd) };
102 if himc.is_null() {
103 return ImeConversionMode::empty();
104 }
105
106 let mut convmode = 0u32;
107 let mut sentence = 0u32;
108 unsafe { ImmGetConversionStatus(himc, &mut convmode, &mut sentence) };
109 unsafe { ImmReleaseContext(hwnd, himc) };
110
111 ImeConversionMode::from_bits_retain(convmode)
112}
113
114pub fn get_ime_conversion_mode() -> ImeConversionMode {
116 let hwnd = unsafe { GetFocus() };
117 get_window_ime_conversion_mode(hwnd)
118}
119
120pub fn set_window_ime_conversion_mode(hwnd: HWND, convmode: ImeConversionMode) {
124 let himc = unsafe { ImmGetContext(hwnd) };
125 if himc.is_null() {
126 return;
127 }
128
129 unsafe { ImmSetConversionStatus(himc, convmode.bits(), 0) };
130 unsafe { ImmReleaseContext(hwnd, himc) };
131}
132
133pub fn set_ime_conversion_mode(convmode: ImeConversionMode) {
135 let hwnd = unsafe { GetFocus() };
136 set_window_ime_conversion_mode(hwnd, convmode);
137}