ime.h文件
#ifndef _H_IME_
#define _H_IME_
#define IDC_NovaSKB1 (MY_USR_NUM*2+0)
#define IDC_NovaSKB2 (MY_USR_NUM*2+1)
#define IDC_NovaSKB3 (MY_USR_NUM*2+2)
#define IDC_NovaSKB4 (MY_USR_NUM*2+3)
#define IDC_NovaSKB5 (MY_USR_NUM*2+4)
#define ITEM_NUM1 14 // coolbar 第一行的数量
#define ITEM_NUM2 14 // coolbar 第2行的数量
#define ITEM_NUM3 12 // coolbar 第3行的数量
#define ITEM_NUM4 12 // coolbar 第4行的数量
#define ITEM_NUM5 8 //coolbar 第5行的数量
#define SKB_WIDTH (405)
#define SKB_HIGH (22)
#define SKB_START_X (240)
#define SKB_START_Y (278)
static WNDPROC old_novaskb_proc; //old proc 函数指针
static WNDPROC old_ime_proc; //old ime proc
//关闭屏幕键盘
#ifndef MSG_CLOSE_SCREEN_KB
#define MSG_CLOSE_SCREEN_KB (MSG_USER+100)
#endif
//打开屏幕键盘
#ifndef MSG_OPEN_SCREEN_KB
#define MSG_OPEN_SCREEN_KB (MSG_USER+101)
#endif
/************************************************************************************************************************************************************************************************
************************************************************************************************************************************************************************************************
*******************************************************************************************************************************************************************************************/
//输入法头文件定义部分
/************************************************************************************************************************************************************************************************
*******************************************************************************************************************************************************************************************
************************************************************************************************************************************************************************************************/
/************************************************************************************************************************************************************************************************
输入法第一行定义
*******************************************************************************************************************************************************************************************/
static const char* caption1[] =
{
" ` ", " 1 ", " 2 ", " 3 ", " 4 ", " 5 "," 6 ", " 7 ", " 8 ", " 9 ", " 0 ", " - ", " = ", " <- "
};
static const int SCANCODE1[] =
{
SCANCODE_GRAVE, SCANCODE_1, SCANCODE_2, SCANCODE_3, SCANCODE_4,
SCANCODE_5, SCANCODE_6, SCANCODE_7, SCANCODE_8, SCANCODE_9,
SCANCODE_0, SCANCODE_MINUS, SCANCODE_EQUAL, SCANCODE_BACKSPACE
};
/************************************************************************************************************************************************************************************************
输入法第二行定义
*******************************************************************************************************************************************************************************************/
static const char* caption2[] =
{
"Tab", " q ", " w ", " e ", " r ", " t "," y ", " u ", " i ", " o ", " p ", " [ ", " ] ", " // "
};
static const int SCANCODE2[] =
{
SCANCODE_TAB, SCANCODE_Q, SCANCODE_W, SCANCODE_E, SCANCODE_R,
SCANCODE_T, SCANCODE_Y, SCANCODE_U, SCANCODE_I, SCANCODE_O,
SCANCODE_P, SCANCODE_BRACKET_LEFT, SCANCODE_BRACKET_RIGHT, SCANCODE_BACKSLASH
};
/************************************************************************************************************************************************************************************************
输入法第三行定义
*******************************************************************************************************************************************************************************************/
static const char* caption3[] =
{
"Shift ", " a ", " s ", " d ", " f ", " g "," h ", " j ", " k ", " l ", " ; ", " ' "
};
static const int SCANCODE3[] =
{
SCANCODE_LEFTSHIFT, SCANCODE_A, SCANCODE_S, SCANCODE_D, SCANCODE_F,
SCANCODE_G, SCANCODE_H, SCANCODE_J, SCANCODE_K, SCANCODE_L,
SCANCODE_SEMICOLON, SCANCODE_APOSTROPHE
};
/************************************************************************************************************************************************************************************************
输入法第四行定义
*******************************************************************************************************************************************************************************************/
static const char* caption4[] =
{
"Ctrl ", " z ", " x ", " c ", " v ", " b "," n ", " m ", " , ", " . ", " / ", "Enter "
};
static const int SCANCODE4[] =
{
SCANCODE_LEFTCONTROL, SCANCODE_Z, SCANCODE_X, SCANCODE_C, SCANCODE_V,
SCANCODE_B, SCANCODE_N, SCANCODE_M, SCANCODE_COMMA, SCANCODE_PERIOD,
SCANCODE_SLASH, SCANCODE_ENTER
};
/************************************************************************************************************************************************************************************************
输入法第五行定义
*******************************************************************************************************************************************************************************************/
static const char* caption5[] =
{
"Del ","English " , "Chinese ", " Space ", " | ", " | ", " -> ", " <- "
};
static const int SCANCODE5[] =
{
SCANCODE_REMOVE, -1, -1, SCANCODE_SPACE, SCANCODE_CURSORBLOCKDOWN,
SCANCODE_CURSORBLOCKUP, SCANCODE_CURSORBLOCKLEFT, SCANCODE_CURSORBLOCKRIGHT
};
/***********************************************************************************************************************************************************************************************
Func Name :CreateScreenKB 外部接口
Function :创建屏幕输入法
Param :
hWnd :父窗口的句柄
hWndKb:屏幕键盘窗口句柄-----5行共五个窗口句柄
Return
:输入法窗口的句柄
Author :luv.y@qq.com
***********************************************************************************************************************************************************************************************/
HWND CreateScreenKB(HWND hWnd,HWND *hWndKb);
#endif
ime.c
#ifndef _C_IME_
#define _C_IME_
#include "ime.h"
/************************************************************************************************************************************************************************************************
************************************************************************************************************************************************************************************************
*******************************************************************************************************************************************************************************************/
//输入法实现部分
/************************************************************************************************************************************************************************************************
*******************************************************************************************************************************************************************************************
************************************************************************************************************************************************************************************************/
/***********************************************************************************************************************************************************************************************
Func Name :novaskb_proc
Function :截获MSG_MOUSEACTIVE消息,使得coolbar 窗口无法获得输入焦点
Param :
hWnd :父窗口的句柄
其他的参数与一般的消息响应函数一致
Return :原 proc的返回值
Author :luv.y@qq.com
***********************************************************************************************************************************************************************************************/
static int novaskb_proc(HWND hWnd,int message,WPARAM wParam,LPARAM lParam)
{
if(message == MSG_MOUSEACTIVE)
return 0;
return (*old_novaskb_proc)(hWnd,message,wParam,lParam);
}
/***********************************************************************************************************************************************************************************************
Func Name :ime_proc
Function :
Param :
hWnd :父窗口的句柄
其他的参数与一般的消息响应函数一致
Return :原 proc的返回值
Author :luv.y@qq.com
***********************************************************************************************************************************************************************************************/
static int ime_proc(HWND hWnd,int message,WPARAM wParam,LPARAM lParam)
{
HWND m_hWnd = hWnd;
switch(message)
{
case MSG_MOUSEACTIVE:
break;
case MSG_IME_OPEN:
{
while( (m_hWnd = GetNextMainWindow(m_hWnd)) )
{
if( (strncmp( GetWindowCaption(m_hWnd) , APPLICATION_NAME ,strlen(APPLICATION_NAME)) == 0) )
SendNotifyMessage(m_hWnd,MSG_USER,MSG_OPEN_SCREEN_KB,0);
}
break;
}
case MSG_IME_CLOSE:
{
while( (m_hWnd = GetNextMainWindow(m_hWnd)) )
{
if( (strncmp( GetWindowCaption(m_hWnd) , APPLICATION_NAME ,strlen(APPLICATION_NAME)) == 0) )
SendNotifyMessage(m_hWnd,MSG_USER,MSG_CLOSE_SCREEN_KB,0);
}
break;
}
}
return (*old_ime_proc)(hWnd,message,wParam,lParam);
}
/***********************************************************************************************************************************************************************************************
Func Name :create_novaskb1
Function :创建输入法的第一行
Param :
hWnd :父窗口的句柄
Return :子窗口的句柄
Author :luv.y@qq.com
***********************************************************************************************************************************************************************************************/
static HWND create_novaskb1 (HWND hWnd)
{
HWND cb;
COOLBARITEMINFO item;
int i;
cb = CreateWindow (CTRL_COOLBAR,
"",
WS_CHILD | WS_VISIBLE | WS_BORDER,
IDC_NovaSKB1,
SKB_START_X, SKB_START_Y, SKB_WIDTH, SKB_HIGH,
hWnd,
0);
item.ItemType = TYPE_TEXTITEM;
item.Bmp = NULL;
item.dwAddData = 0;
for (i = 0; i < ITEM_NUM1; i++)
{
item.insPos = i;
item.id = i;
item.Caption = caption1[i];
item.ItemHint = NULL;//SCANCODE1[i];
SendMessage (cb, CBM_ADDITEM, 0, (LPARAM)&item);
}
old_novaskb_proc = SetWindowCallbackProc(cb,novaskb_proc);
SetWindowCallbackProc(cb,novaskb_proc);
return cb;
}
/***********************************************************************************************************************************************************************************************
Func Name :create_novaskb2
Function :创建输入法的第2行
Param :
hWnd :父窗口的句柄
Return :子窗口的句柄
Author :luv.y@qq.com
***********************************************************************************************************************************************************************************************/
static HWND create_novaskb2 (HWND hWnd)
{
HWND cb;
COOLBARITEMINFO item;
int i;
cb = CreateWindow (CTRL_COOLBAR,
"",
WS_CHILD | WS_VISIBLE | WS_BORDER,
IDC_NovaSKB2,
SKB_START_X, SKB_START_Y+22, SKB_WIDTH, SKB_HIGH,
hWnd,
0);
item.ItemType = TYPE_TEXTITEM;
item.Bmp = NULL;
item.dwAddData = 0;
for (i = 0; i < ITEM_NUM2; i++)
{
item.insPos = i;
item.id = i;
item.Caption = caption2[i];
item.ItemHint = NULL;//SCANCODE1[i];
SendMessage (cb, CBM_ADDITEM, 0, (LPARAM)&item);
}
old_novaskb_proc = SetWindowCallbackProc(cb,novaskb_proc);
SetWindowCallbackProc(cb,novaskb_proc);
return cb;
}
/***********************************************************************************************************************************************************************************************
Func Name :create_novaskb3
Function :创建输入法的第3行
Param :
hWnd :父窗口的句柄
Return :子窗口的句柄
Author :luv.y@qq.com
***********************************************************************************************************************************************************************************************/
static HWND create_novaskb3 (HWND hWnd)
{
HWND cb;
COOLBARITEMINFO item;
int i;
cb = CreateWindow (CTRL_COOLBAR,
"",
WS_CHILD | WS_VISIBLE | WS_BORDER,
IDC_NovaSKB3,
SKB_START_X, SKB_START_Y+22*2, SKB_WIDTH, SKB_HIGH,
hWnd,
0);
item.ItemType = TYPE_TEXTITEM;
item.Bmp = NULL;
item.dwAddData = 0;
for (i = 0; i < ITEM_NUM3; i++)
{
item.insPos = i;
item.id = i;
item.Caption = caption3[i];
item.ItemHint = NULL;//SCANCODE1[i];
SendMessage (cb, CBM_ADDITEM, 0, (LPARAM)&item);
}
old_novaskb_proc = SetWindowCallbackProc(cb,novaskb_proc);
SetWindowCallbackProc(cb,novaskb_proc);
return cb;
}
/***********************************************************************************************************************************************************************************************
Func Name :create_novaskb4
Function :创建输入法的第4行
Param :
hWnd :父窗口的句柄
Return :子窗口的句柄
Author :luv.y@qq.com
***********************************************************************************************************************************************************************************************/
static HWND create_novaskb4 (HWND hWnd)
{
HWND cb;
COOLBARITEMINFO item;
int i;
cb = CreateWindow (CTRL_COOLBAR,
"",
WS_CHILD | WS_VISIBLE | WS_BORDER,
IDC_NovaSKB4,
SKB_START_X, SKB_START_Y+22*3, SKB_WIDTH, SKB_HIGH,
hWnd,
0);
item.ItemType = TYPE_TEXTITEM;
item.Bmp = NULL;
item.dwAddData = 0;
for (i = 0; i < ITEM_NUM4; i++)
{
item.insPos = i;
item.id = i;
item.Caption = caption4[i];
item.ItemHint = NULL;//SCANCODE1[i];
SendMessage (cb, CBM_ADDITEM, 0, (LPARAM)&item);
}
old_novaskb_proc = SetWindowCallbackProc(cb,novaskb_proc);
SetWindowCallbackProc(cb,novaskb_proc);
return cb;
}
/***********************************************************************************************************************************************************************************************
Func Name :create_novaskb5
Function :创建输入法的第5行
Param :
hWnd :父窗口的句柄
Return :子窗口的句柄
Author :luv.y@qq.com
***********************************************************************************************************************************************************************************************/
static HWND create_novaskb5 (HWND hWnd)
{
HWND cb;
COOLBARITEMINFO item;
int i;
cb = CreateWindow (CTRL_COOLBAR,
"",
WS_CHILD | WS_VISIBLE | WS_BORDER,
IDC_NovaSKB5,
SKB_START_X, SKB_START_Y+22*4, SKB_WIDTH, SKB_HIGH,
hWnd,
0);
item.ItemType = TYPE_TEXTITEM;
item.Bmp = NULL;
item.dwAddData = 0;
for (i = 0; i < ITEM_NUM5; i++)
{
item.insPos = i;
item.id = i;
item.Caption = caption5[i];
item.ItemHint = NULL;//SCANCODE1[i];
SendMessage (cb, CBM_ADDITEM, 0, (LPARAM)&item);
}
old_novaskb_proc = SetWindowCallbackProc(cb,novaskb_proc);
SetWindowCallbackProc(cb,novaskb_proc);
return cb;
}
/***********************************************************************************************************************************************************************************************
Func Name :CreateScreenKB 外部接口
Function :创建屏幕输入法
Param :
hWnd :父窗口的句柄
hWndKb:屏幕键盘窗口句柄-----5行共五个窗口句柄
Return
-1 :失败
0 :success
Author :luv.y@qq.com
***********************************************************************************************************************************************************************************************/
HWND CreateScreenKB(HWND hWnd,HWND *hWndKb)
{
HWND hIMEWnd;
if( hWnd == HWND_INVALID )
return -1;
//加载IME引擎
hWndKb[0] = create_novaskb1(hWnd);
hWndKb[1] = create_novaskb2(hWnd);
hWndKb[2] = create_novaskb3(hWnd);
hWndKb[3] = create_novaskb4(hWnd);
hWndKb[4] = create_novaskb5(hWnd);
//屏幕键盘初始处于隐藏状态,需要的时候再用SendMessage的方式打开
//for( i = 0;i < KB_NUM;i++ )
//if(hWndKb[i])
//ShowWindow(hWndKb[i],SW_HIDE);
//创建 GB2312输入法入口函数
hIMEWnd = GBIMEWindow(hWnd);
old_ime_proc = SetWindowCallbackProc(hIMEWnd,ime_proc);
SetWindowCallbackProc(hIMEWnd,ime_proc);
return hIMEWnd;
}
/************************************************************************************************************************************************************************************/
#endif
2009-12-03