Reactos
1/*
2 * PROJECT: ReactOS headers
3 * LICENSE: LGPL-2.0-or-later (https://spdx.org/licenses/LGPL-2.0-or-later)
4 * PURPOSE: Providing DDK-compatible <immdev.h> and IME/IMM development helper
5 * COPYRIGHT: Copyright 2021-2024 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 */
7
8#ifndef _IMMDEV_
9#define _IMMDEV_
10
11#pragma once
12
13#include <wingdi.h>
14#include <imm.h>
15
16#ifdef __cplusplus
17extern "C" {
18#endif
19
20typedef struct _tagIMEINFO {
21 DWORD dwPrivateDataSize;
22 DWORD fdwProperty;
23 DWORD fdwConversionCaps;
24 DWORD fdwSentenceCaps;
25 DWORD fdwUICaps;
26 DWORD fdwSCSCaps;
27 DWORD fdwSelectCaps;
28} IMEINFO, *PIMEINFO, NEAR *NPIMEINFO, FAR *LPIMEINFO;
29
30typedef struct tagCANDIDATEINFO {
31 DWORD dwSize;
32 DWORD dwCount;
33 DWORD dwOffset[32];
34 DWORD dwPrivateSize;
35 DWORD dwPrivateOffset;
36} CANDIDATEINFO, *PCANDIDATEINFO, NEAR *NPCANDIDATEINFO, FAR *LPCANDIDATEINFO;
37
38#if (WINVER >= 0x040A)
39BOOL WINAPI ImmDisableTextFrameService(_In_ DWORD dwThreadId);
40#endif
41
42typedef struct tagSOFTKBDDATA {
43 UINT uCount;
44 WORD wCode[ANYSIZE_ARRAY][256];
45} SOFTKBDDATA, *PSOFTKBDDATA, NEAR *NPSOFTKBDDATA, FAR *LPSOFTKBDDATA;
46
47typedef struct tagCOMPOSITIONSTRING {
48 DWORD dwSize;
49 DWORD dwCompReadAttrLen;
50 DWORD dwCompReadAttrOffset;
51 DWORD dwCompReadClauseLen;
52 DWORD dwCompReadClauseOffset;
53 DWORD dwCompReadStrLen;
54 DWORD dwCompReadStrOffset;
55 DWORD dwCompAttrLen;
56 DWORD dwCompAttrOffset;
57 DWORD dwCompClauseLen;
58 DWORD dwCompClauseOffset;
59 DWORD dwCompStrLen;
60 DWORD dwCompStrOffset;
61 DWORD dwCursorPos;
62 DWORD dwDeltaStart;
63 DWORD dwResultReadClauseLen;
64 DWORD dwResultReadClauseOffset;
65 DWORD dwResultReadStrLen;
66 DWORD dwResultReadStrOffset;
67 DWORD dwResultClauseLen;
68 DWORD dwResultClauseOffset;
69 DWORD dwResultStrLen;
70 DWORD dwResultStrOffset;
71 DWORD dwPrivateSize;
72 DWORD dwPrivateOffset;
73} COMPOSITIONSTRING, *PCOMPOSITIONSTRING, NEAR *NPCOMPOSITIONSTRING, FAR *LPCOMPOSITIONSTRING;
74
75typedef struct tagGUIDELINE {
76 DWORD dwSize;
77 DWORD dwLevel;
78 DWORD dwIndex;
79 DWORD dwStrLen;
80 DWORD dwStrOffset;
81 DWORD dwPrivateSize;
82 DWORD dwPrivateOffset;
83} GUIDELINE, *PGUIDELINE, NEAR *NPGUIDELINE, FAR *LPGUIDELINE;
84
85/* wParam for WM_IME_CONTROL */
86#define IMC_GETCONVERSIONMODE 0x0001
87#define IMC_GETSENTENCEMODE 0x0003
88#define IMC_GETOPENSTATUS 0x0005
89#define IMC_GETSOFTKBDFONT 0x0011
90#define IMC_SETSOFTKBDFONT 0x0012
91#define IMC_GETSOFTKBDPOS 0x0013
92#define IMC_SETSOFTKBDPOS 0x0014
93#define IMC_GETSOFTKBDSUBTYPE 0x0015
94#define IMC_SETSOFTKBDSUBTYPE 0x0016
95#define IMC_SETSOFTKBDDATA 0x0018
96
97/* wParam for WM_IME_NOTIFY */
98#define IMN_SOFTKBDDESTROYED 0x0011
99
100#define IMMGWL_IMC 0
101#define IMMGWL_PRIVATE (sizeof(LONG))
102
103#define IMMGWLP_IMC 0
104#define IMMGWLP_PRIVATE (sizeof(LONG_PTR))
105
106typedef struct _tagINPUTCONTEXT {
107 HWND hWnd;
108 BOOL fOpen;
109 POINT ptStatusWndPos;
110 POINT ptSoftKbdPos;
111 DWORD fdwConversion;
112 DWORD fdwSentence;
113 union {
114 LOGFONTA A;
115 LOGFONTW W;
116 } lfFont;
117 COMPOSITIONFORM cfCompForm;
118 CANDIDATEFORM cfCandForm[4];
119 HIMCC hCompStr;
120 HIMCC hCandInfo;
121 HIMCC hGuideLine;
122 HIMCC hPrivate;
123 DWORD dwNumMsgBuf;
124 HIMCC hMsgBuf;
125 DWORD fdwInit;
126 DWORD dwReserve[3];
127} INPUTCONTEXT, *PINPUTCONTEXT, NEAR *NPINPUTCONTEXT, FAR *LPINPUTCONTEXT;
128
129#ifndef _WIN64
130C_ASSERT(offsetof(INPUTCONTEXT, hWnd) == 0x0);
131C_ASSERT(offsetof(INPUTCONTEXT, fOpen) == 0x4);
132C_ASSERT(offsetof(INPUTCONTEXT, ptStatusWndPos) == 0x8);
133C_ASSERT(offsetof(INPUTCONTEXT, ptSoftKbdPos) == 0x10);
134C_ASSERT(offsetof(INPUTCONTEXT, fdwConversion) == 0x18);
135C_ASSERT(offsetof(INPUTCONTEXT, fdwSentence) == 0x1C);
136C_ASSERT(offsetof(INPUTCONTEXT, lfFont) == 0x20);
137C_ASSERT(offsetof(INPUTCONTEXT, cfCompForm) == 0x7C);
138C_ASSERT(offsetof(INPUTCONTEXT, cfCandForm) == 0x98);
139C_ASSERT(offsetof(INPUTCONTEXT, hCompStr) == 0x118);
140C_ASSERT(offsetof(INPUTCONTEXT, hCandInfo) == 0x11C);
141C_ASSERT(offsetof(INPUTCONTEXT, hGuideLine) == 0x120);
142C_ASSERT(offsetof(INPUTCONTEXT, hPrivate) == 0x124);
143C_ASSERT(offsetof(INPUTCONTEXT, dwNumMsgBuf) == 0x128);
144C_ASSERT(offsetof(INPUTCONTEXT, hMsgBuf) == 0x12C);
145C_ASSERT(offsetof(INPUTCONTEXT, fdwInit) == 0x130);
146C_ASSERT(offsetof(INPUTCONTEXT, dwReserve) == 0x134);
147C_ASSERT(sizeof(INPUTCONTEXT) == 0x140);
148#endif
149
150/* bits of fdwInit of INPUTCONTEXT */
151#define INIT_STATUSWNDPOS 0x00000001
152#define INIT_CONVERSION 0x00000002
153#define INIT_SENTENCE 0x00000004
154#define INIT_LOGFONT 0x00000008
155#define INIT_COMPFORM 0x00000010
156#define INIT_SOFTKBDPOS 0x00000020
157#define INIT_GUIDMAP 0x00000040
158
159/* bits for INPUTCONTEXTDX.dwChange */
160#define INPUTCONTEXTDX_CHANGE_OPEN 0x1
161#define INPUTCONTEXTDX_CHANGE_CONVERSION 0x2
162#define INPUTCONTEXTDX_CHANGE_SENTENCE 0x4
163#define INPUTCONTEXTDX_CHANGE_FORCE_OPEN 0x100
164
165#ifndef WM_IME_REPORT
166 #define WM_IME_REPORT 0x280
167#endif
168
169/* WM_IME_REPORT wParam */
170#define IR_STRINGSTART 0x100
171#define IR_STRINGEND 0x101
172#define IR_OPENCONVERT 0x120
173#define IR_CHANGECONVERT 0x121
174#define IR_CLOSECONVERT 0x122
175#define IR_FULLCONVERT 0x123
176#define IR_IMESELECT 0x130
177#define IR_STRING 0x140
178#define IR_DBCSCHAR 0x160
179#define IR_UNDETERMINE 0x170
180#define IR_STRINGEX 0x180
181#define IR_MODEINFO 0x190
182
183/* IMC */
184
185LPINPUTCONTEXT WINAPI ImmLockIMC(_In_ HIMC hIMC);
186BOOL WINAPI ImmUnlockIMC(_In_ HIMC hIMC);
187DWORD WINAPI ImmGetIMCLockCount(_In_ HIMC hIMC);
188
189/* IMCC */
190
191HIMCC WINAPI ImmCreateIMCC(_In_ DWORD size);
192HIMCC WINAPI ImmDestroyIMCC(_In_ HIMCC block);
193LPVOID WINAPI ImmLockIMCC(_In_ HIMCC imcc);
194BOOL WINAPI ImmUnlockIMCC(_In_ HIMCC imcc);
195DWORD WINAPI ImmGetIMCCLockCount(_In_ HIMCC imcc);
196HIMCC WINAPI ImmReSizeIMCC(_In_ HIMCC imcc, _In_ DWORD size);
197DWORD WINAPI ImmGetIMCCSize(_In_ HIMCC imcc);
198
199/* Messaging */
200
201BOOL WINAPI ImmGenerateMessage(_In_ HIMC hIMC);
202
203BOOL WINAPI
204ImmTranslateMessage(
205 _In_ HWND hwnd,
206 _In_ UINT msg,
207 _In_ WPARAM wParam,
208 _In_ LPARAM lKeyData);
209
210LRESULT WINAPI ImmRequestMessageA(_In_ HIMC hIMC, _In_ WPARAM wParam, _In_ LPARAM lParam);
211LRESULT WINAPI ImmRequestMessageW(_In_ HIMC hIMC, _In_ WPARAM wParam, _In_ LPARAM lParam);
212
213#ifdef UNICODE
214 #define ImmRequestMessage ImmRequestMessageW
215#else
216 #define ImmRequestMessage ImmRequestMessageA
217#endif
218
219typedef struct _tagTRANSMSG {
220 UINT message;
221 WPARAM wParam;
222 LPARAM lParam;
223} TRANSMSG, *PTRANSMSG, NEAR *NPTRANSMSG, FAR *LPTRANSMSG;
224
225typedef struct _tagTRANSMSGLIST {
226 UINT uMsgCount;
227 TRANSMSG TransMsg[ANYSIZE_ARRAY];
228} TRANSMSGLIST, *PTRANSMSGLIST, NEAR *NPTRANSMSGLIST, FAR *LPTRANSMSGLIST;
229
230/* Soft keyboard */
231
232HWND WINAPI
233ImmCreateSoftKeyboard(
234 _In_ UINT uType,
235 _In_ HWND hwndParent,
236 _In_ INT x,
237 _In_ INT y);
238
239BOOL WINAPI
240ImmShowSoftKeyboard(
241 _In_ HWND hwndSoftKBD,
242 _In_ INT nCmdShow);
243
244BOOL WINAPI
245ImmDestroySoftKeyboard(
246 _In_ HWND hwndSoftKBD);
247
248/* IME file interface */
249
250BOOL WINAPI
251ImeInquire(
252 _Out_ LPIMEINFO lpIMEInfo,
253 _Out_ LPTSTR lpszWndClass,
254 _In_ DWORD dwSystemInfoFlags);
255
256DWORD WINAPI
257ImeConversionList(
258 _In_ HIMC hIMC,
259 _In_ LPCTSTR lpSrc,
260 _Out_ LPCANDIDATELIST lpDst,
261 _In_ DWORD dwBufLen,
262 _In_ UINT uFlag);
263
264BOOL WINAPI
265ImeRegisterWord(
266 _In_ LPCTSTR lpszReading,
267 _In_ DWORD dwStyle,
268 _In_ LPCTSTR lpszString);
269
270BOOL WINAPI
271ImeUnregisterWord(
272 _In_ LPCTSTR lpszReading,
273 _In_ DWORD dwStyle,
274 _In_ LPCTSTR lpszString);
275
276UINT WINAPI
277ImeGetRegisterWordStyle(
278 _In_ UINT nItem,
279 _Out_ LPSTYLEBUF lpStyleBuf);
280
281UINT WINAPI
282ImeEnumRegisterWord(
283 _In_ REGISTERWORDENUMPROC lpfnEnumProc,
284 _In_opt_ LPCTSTR lpszReading,
285 _In_ DWORD dwStyle,
286 _In_opt_ LPCTSTR lpszString,
287 _In_opt_ LPVOID lpData);
288
289BOOL WINAPI
290ImeConfigure(
291 _In_ HKL hKL,
292 _In_ HWND hWnd,
293 _In_ DWORD dwMode,
294 _Inout_opt_ LPVOID lpData);
295
296BOOL WINAPI
297ImeDestroy(
298 _In_ UINT uReserved);
299
300LRESULT WINAPI
301ImeEscape(
302 _In_ HIMC hIMC,
303 _In_ UINT uEscape,
304 _Inout_opt_ LPVOID lpData);
305
306BOOL WINAPI
307ImeProcessKey(
308 _In_ HIMC hIMC,
309 _In_ UINT uVirKey,
310 _In_ LPARAM lParam,
311 _In_ CONST LPBYTE lpbKeyState);
312
313BOOL WINAPI
314ImeSelect(
315 _In_ HIMC hIMC,
316 _In_ BOOL fSelect);
317
318BOOL WINAPI
319ImeSetActiveContext(
320 _In_ HIMC hIMC,
321 _In_ BOOL fFlag);
322
323UINT WINAPI
324ImeToAsciiEx(
325 _In_ UINT uVirKey,
326 _In_ UINT uScanCode,
327 _In_ CONST LPBYTE lpbKeyState,
328 _Out_ LPTRANSMSGLIST lpTransMsgList,
329 _In_ UINT fuState,
330 _In_ HIMC hIMC);
331
332BOOL WINAPI
333NotifyIME(
334 _In_ HIMC hIMC,
335 _In_ DWORD dwAction,
336 _In_ DWORD dwIndex,
337 _In_ DWORD_PTR dwValue);
338
339BOOL WINAPI
340ImeSetCompositionString(
341 _In_ HIMC hIMC,
342 _In_ DWORD dwIndex,
343 _In_opt_ LPCVOID lpComp,
344 _In_ DWORD dwCompLen,
345 _In_opt_ LPCVOID lpRead,
346 _In_ DWORD dwReadLen);
347
348DWORD WINAPI
349ImeGetImeMenuItems(
350 _In_ HIMC hIMC,
351 _In_ DWORD dwFlags,
352 _In_ DWORD dwType,
353 _Inout_opt_ LPIMEMENUITEMINFO lpImeParentMenu,
354 _Inout_opt_ LPIMEMENUITEMINFO lpImeMenu,
355 _In_ DWORD dwSize);
356
357#ifdef __cplusplus
358} /* extern "C" */
359#endif
360
361/* IME Property bits */
362#define IME_PROP_END_UNLOAD 0x0001
363#define IME_PROP_KBD_CHAR_FIRST 0x0002
364#define IME_PROP_IGNORE_UPKEYS 0x0004
365#define IME_PROP_NEED_ALTKEY 0x0008
366#define IME_PROP_NO_KEYS_ON_CLOSE 0x0010
367#define IME_PROP_ACCEPT_WIDE_VKEY 0x0020
368
369/* for NI_CONTEXTUPDATED */
370#define IMC_SETCONVERSIONMODE 0x0002
371#define IMC_SETSENTENCEMODE 0x0004
372#define IMC_SETOPENSTATUS 0x0006
373
374/* dwAction for ImmNotifyIME */
375#define NI_CONTEXTUPDATED 0x0003
376#define NI_OPENCANDIDATE 0x0010
377#define NI_CLOSECANDIDATE 0x0011
378#define NI_SELECTCANDIDATESTR 0x0012
379#define NI_CHANGECANDIDATELIST 0x0013
380#define NI_FINALIZECONVERSIONRESULT 0x0014
381#define NI_COMPOSITIONSTR 0x0015
382#define NI_SETCANDIDATE_PAGESTART 0x0016
383#define NI_SETCANDIDATE_PAGESIZE 0x0017
384#define NI_IMEMENUSELECTED 0x0018
385
386/* dwSystemInfoFlags bits */
387#define IME_SYSINFO_WINLOGON 0x0001
388#define IME_SYSINFO_WOW16 0x0002
389
390#endif /* ndef _IMMDEV_ */