Reactos
at master 390 lines 11 kB view raw
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_ */