📄 imm.c
字号:
/*
* This file is part of Saenaru.
*
* Copyright (C) 2003 Hye-Shik Chang. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Perky$
*/
/*++
Copyright (c) 1990-1998 Microsoft Corporation, All Rights Reserved
Module Name:
IMM.C
++*/
#include "windows.h"
#include "immdev.h"
#include "saenaru.h"
int GetCandidateStringsFromDictionary(LPWSTR lpString, LPWSTR lpBuf, DWORD dwBufLen, LPTSTR szDicFileName);
/**********************************************************************/
/* ImeInquire() */
/* */
/**********************************************************************/
BOOL WINAPI ImeInquire(LPIMEINFO lpIMEInfo,LPTSTR lpszClassName,DWORD dwSystemInfoFlags)
{
ImeLog(LOGF_ENTRY | LOGF_API, TEXT("ImeInquire"));
// Init IMEINFO Structure.
lpIMEInfo->dwPrivateDataSize = sizeof(UIEXTRA);
lpIMEInfo->fdwProperty = IME_PROP_KBD_CHAR_FIRST |
IME_PROP_UNICODE |
// IME_PROP_COMPLETE_ON_UNSELECT |
IME_PROP_AT_CARET;
lpIMEInfo->fdwConversionCaps = IME_CMODE_LANGUAGE |
IME_CMODE_FULLSHAPE |
IME_CMODE_NOCONVERSION |
IME_CMODE_ROMAN |
IME_CMODE_SOFTKBD |
IME_CMODE_CHARCODE;
lpIMEInfo->fdwSentenceCaps = 0L;
lpIMEInfo->fdwUICaps = UI_CAP_2700
| UI_CAP_SOFTKBD
;
lpIMEInfo->fdwSCSCaps = SCS_CAP_COMPSTR |
SCS_CAP_MAKEREAD |
SCS_CAP_SETRECONVERTSTRING;
lpIMEInfo->fdwSelectCaps = SELECT_CAP_CONVERSION;
lstrcpy(lpszClassName,(LPTSTR)szUIClassName);
return TRUE;
}
/**********************************************************************/
/* ImeConversionList() */
/* */
/**********************************************************************/
DWORD WINAPI ImeConversionList(HIMC hIMC,LPCTSTR lpSource,LPCANDIDATELIST lpCandList,DWORD dwBufLen,UINT uFlags)
{
ImeLog(LOGF_API, TEXT("ImeConversionList"));
return 0;
}
/**********************************************************************/
/* ImeDestroy() */
/* */
/**********************************************************************/
BOOL WINAPI ImeDestroy(UINT uForce)
{
ImeLog(LOGF_ENTRY | LOGF_API, TEXT("ImeDestroy"));
return TRUE;
}
/**********************************************************************/
/* ImeEscape() */
/* */
/**********************************************************************/
LRESULT WINAPI ImeEscape(HIMC hIMC,UINT uSubFunc,LPVOID lpData)
{
LRESULT lRet = FALSE;
ImeLog(LOGF_API, TEXT("ImeEscape"));
switch (uSubFunc)
{
case IME_ESC_QUERY_SUPPORT:
switch (*(LPUINT)lpData)
{
case IME_ESC_QUERY_SUPPORT:
case IME_ESC_PRI_GETDWORDTEST:
case IME_ESC_GETHELPFILENAME:
lRet = TRUE;
break;
default:
lRet = FALSE;
break;
}
break;
case IME_ESC_PRI_GETDWORDTEST:
lRet = 0x12345678;
break;
case IME_ESC_GETHELPFILENAME:
Mylstrcpy((LPMYSTR)lpData, MYTEXT("saenaru.hlp"));
lRet = TRUE;
break;
default:
lRet = FALSE;
break;
}
return lRet;
}
/**********************************************************************/
/* ImeSetActiveContext() */
/* */
/**********************************************************************/
BOOL WINAPI ImeSetActiveContext(HIMC hIMC,BOOL fFlag)
{
ImeLog(LOGF_API, TEXT("ImeSetActiveContext"));
UpdateIndicIcon(hIMC);
return TRUE;
}
/**********************************************************************/
/* ImeProcessKey() */
/* */
/**********************************************************************/
BOOL WINAPI ImeProcessKey(HIMC hIMC,UINT vKey,LPARAM lKeyData,CONST LPBYTE lpbKeyState)
{
BOOL fRet = FALSE;
BOOL fOpen;
BOOL fCompStr = FALSE;
LPINPUTCONTEXT lpIMC;
LPCOMPOSITIONSTRING lpCompStr;
DWORD dwConversion, dwSentense ;
WORD ch;
ImeLog(LOGF_KEY | LOGF_API, TEXT("ImeProcessKey"));
{
WORD ch;
MyDebugPrint((TEXT("\t** vKey is 0x%x\r\n"),vKey));
}
if (lKeyData & 0x80000000)
{
return FALSE;
}
MyDebugPrint((TEXT("\t** lKeyData is 0x%x\r\n"),lKeyData));
if (!(lpIMC = ImmLockIMC(hIMC)))
return FALSE;
// SHIFT-SPACE
// See ui.c how to hook the shift-space event.
if ( (LOWORD(vKey) & 0x00FF) == VK_SPACE)
{
//SHORT ShiftState = (GetKeyState(VK_SHIFT) >> 31) & 1;
SHORT ShiftState = lpbKeyState[VK_SHIFT] & 0x80;
if (ShiftState)
vKey = VK_HANGUL;
}
switch ( ( LOWORD(vKey) & 0x00FF ) ){
case VK_HANGUL:
// Toggle Hangul composition state
//
if (IsCompStr(hIMC))
MakeResultString(hIMC,TRUE);
fOpen = ImmGetOpenStatus(hIMC);
if (!fOpen)
ImmSetOpenStatus(hIMC,TRUE);
if (ImmGetConversionStatus (hIMC, &dwConversion, &dwSentense))
{
if (fOpen)
{
dwConversion &= ~IME_CMODE_NATIVE;
dwConversion &= ~IME_CMODE_FULLSHAPE;
MyDebugPrint((TEXT("O Hangul key\n")));
fOpen=FALSE;
}
else
{
dwConversion &= ~IME_CMODE_FULLSHAPE;
dwConversion |= IME_CMODE_NATIVE;
MyDebugPrint((TEXT("O Hangul key\n")));
fOpen=TRUE;
}
ImmSetConversionStatus (hIMC, dwConversion, 0) ;
}
if (!fOpen)
ImmSetOpenStatus(hIMC,FALSE);
return FALSE;
break;
case VK_SHIFT:
return FALSE;
break;
default:
break;
}
fOpen = lpIMC->fOpen;
if (fOpen)
{
if (lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr))
{
if ((lpCompStr->dwSize > sizeof(COMPOSITIONSTRING)) &&
(lpCompStr->dwCompStrLen))
fCompStr = TRUE;
}
if (lpbKeyState[VK_MENU] & 0x80)
{
MakeResultString(hIMC,TRUE);
fRet = FALSE;
}
else if (lpbKeyState[VK_CONTROL] & 0x80)
{
if (fCompStr)
fRet = (BOOL)bCompCtl[vKey];
else
fRet = (BOOL)bNoCompCtl[vKey];
}
else if (lpbKeyState[VK_SHIFT] & 0x80)
{
if (fCompStr)
fRet = (BOOL)bCompSht[vKey];
else
fRet = (BOOL)bNoCompSht[vKey];
}
else
{
if (fCompStr)
fRet = (BOOL)bComp[vKey];
else
fRet = (BOOL)bNoComp[vKey];
}
if (lpCompStr)
ImmUnlockIMCC(lpIMC->hCompStr);
}
if (!fRet && IsCompStr(hIMC))
MakeResultString(hIMC,TRUE);
ImmUnlockIMC(hIMC);
return fRet;
}
/**********************************************************************/
/* NotifyIME() */
/* */
/**********************************************************************/
BOOL WINAPI NotifyIME(HIMC hIMC,DWORD dwAction,DWORD dwIndex,DWORD dwValue)
{
LPINPUTCONTEXT lpIMC;
BOOL bRet = FALSE;
LPCOMPOSITIONSTRING lpCompStr;
LPCANDIDATEINFO lpCandInfo;
LPCANDIDATELIST lpCandList;
MYCHAR szBuf[256];
int nBufLen;
LPMYSTR lpstr;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -