问题关键字:紫光/输入法/无响应

chenzhou35 2004-12-16 02:58:13
偶自己写了一个编辑器,此编辑器目前总的来说运行良好,不过发现一个偶无法理解的Bug

在使用紫光拼音3.0的情况下(3.0.0.3045以及3.0.0.0 alpha 21225两个版本),切换输入法偶尔会导致整个应用程序无响应,此时该程序所在进程占用CPU为0(也就是说应该不存在死循环可能),由于此错误出现频率较低(10个人同时用一天可能会出现1到2次中招),截至目前为止未能在Debug运行状态被捕获。

在此编辑器的实现里,偶处理了WM_IME_STARTCOMPOSITION消息,以及WM_IME_NOTIFY(IMN_SETOPENSTATUS)通知。处理代码如下:

case WM_IME_STARTCOMPOSITION:
{
HWND hwnd = GetSafeHwnd();
if(hwnd)
{
HIMC hImc = ImmGetContext(hwnd);
COMPOSITIONFORM cfs;
CPoint pt = GetCaretPos();
cfs.dwStyle = CFS_POINT;
if(pt.x < 1) pt.x = 1;
if(pt.y < 1) pt.y = 1;
cfs.ptCurrentPos = pt;
ImmSetCompositionWindow(hImc, &cfs);
ImmReleaseContext(hwnd, hImc);
}
}
break;
case WM_IME_NOTIFY:
{
switch(wParam)
{
case IMN_SETOPENSTATUS:
{
HWND hwnd = GetSafeHwnd();
if(hwnd)
{
HIMC hImc = ImmGetContext(hwnd);
if(ImmGetOpenStatus(hImc))
{
LOGFONT lf;
if(GetFont(lf))
{
ImmSetCompositionFont(hImc, &lf);
}

COMPOSITIONFORM cfs;
CPoint pt = GetCaretPos();
cfs.dwStyle = CFS_POINT;
cfs.ptCurrentPos = pt;
ImmSetCompositionWindow(hImc, &cfs);
ImmReleaseContext(hwnd, hImc);
}
}
}
break;
}
}
break;

有劳达人帮忙看看,偶实在是不知道哪个地方会引起问题。谢谢了。
...全文
227 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenzhou35 2005-02-03
  • 打赏
  • 举报
回复
实在不知道该给谁分。寒
pcyy 2005-01-21
  • 打赏
  • 举报
回复
UP~~~~
chenzhou35 2005-01-21
  • 打赏
  • 举报
回复
经过观察,我们发现此问题并非只在紫光下出现。其他输入法也可能出现。

目前,有更进一步的发现,不过问题还是没有解决。

我们已经确定程序是在收到WM_INPUTLANGCHANGEREQUEST之后失去的响应,而我的程序对这个消息并未做任何处理,只是直接传给了CWnd::WindowProc;为了查清楚CWnd::WindowProc是在什么操作时引发的这个问题的,我最后接管了此消息,并按照msdn的说明进行了一些试探性处理,处理代码如下:

case WM_INPUTLANGCHANGEREQUEST:
{
if(GetKeyboardLayout(0) == (HKL)lParam)
return 0;
UINT count = GetKeyboardLayoutList(0,NULL);
if(count == 0) return 0;
HKL* lpList = new HKL[count];

count = GetKeyboardLayoutList(count,lpList);
BOOL bFound = FALSE;
for(int i=0;i<count;i++)
{
if((HKL)lParam == lpList[i])
{
bFound = TRUE;
break;
}
}
if(lpList)
{
delete[] lpList;
lpList = NULL;
}
if(!bFound)
{
ITrace_Creater()->Trace(4,true,"> LoadKeyboardLayout:lParam: %08x,threadid: %08x\r\n",lParam,GetCurrentThreadId());

CString sID;
sID.Format("%08x",lParam);
LoadKeyboardLayout(sID,KLF_ACTIVATE);

ITrace_Creater()->Trace(4,true,"< LoadKeyboardLayout:lParam: %08x,threadid: %08x\r\n",lParam,GetCurrentThreadId());
}
else
{
ITrace_Creater()->Trace(4,true,"> ActivateKeyboardLayout:lParam: %08x,threadid: %08x\r\n",lParam,GetCurrentThreadId());

ActivateKeyboardLayout((HKL)lParam,KLF_SETFORPROCESS);

ITrace_Creater()->Trace(4,true,"< ActivateKeyboardLayout:lParam: %08x,threadid: %08x\r\n",lParam,GetCurrentThreadId());
}
}
return 0;

处理结果是,输入法可以正常切换,未见任何异常,也未见任何与系统默认不同的行为。可是以前一样会偶尔失去响应,根据trace信息,现在挂起的位置是ActivateKeyboardLayout,在msdn和google上搜了一下,没有此函数出现此问题的任何介绍。请教各位达人,ActivateKeyboardLayout可能在什么情况下失去响应无法返回。

谢谢
xhzhang6 2005-01-17
  • 打赏
  • 举报
回复


紫光输入法经常出问题的
上次经常出现蓝屏,
最后发现就是它的问题
卸装重新安装

(烂也没办法,用习惯了)


chenzhou35 2005-01-17
  • 打赏
  • 举报
回复
UP~~~~
chenzhou35 2005-01-13
  • 打赏
  • 举报
回复
最近此问题愈加频繁的出现,我不得不采用高强度日志的方式来寻求问题的原因了。
经过几天的日志,目前进一步缩小了问题可能出现的范围,不过还是不清楚为什么,也就还没能解决。

经过日志观察,程序失去响应时在执行CWnd::WindowProc中的某行代码(注意,是CWnd的代码,不是我的派生类),具体代码不明,用汇编看是ret,单步执行此行就失去响应,Pause之后还在此行,通过派生类的WindowProc记录下几乎所有进入函数的消息,发现引起这个问题最可能的消息是:WM_INPUTLANGCHANGEREQUEST,所有的程序在失去响应前都记录到这条消息,并且当这条消息传入CWnd::WindowProc之后就再没有返回,而只要它返回了就没有出现问题。

下面提供一下得到的日志,希望大家能看出些道道给予指点。

1、WM_INPUTLANGCHANGEREQUEST 派生类WindowProc截获到此消息,并传入CWnd::WindowProc
2、WM_IME_NOTIFY IMN_CLOSESTATUSWINDOW 在WM_INPUTLANGCHANGEREQUEST没有处理完成前,函数重入,截获到此通知并顺利完成
3、WM_IME_NOTIFY IMN_OPENSTATUSWINDOW 在WM_INPUTLANGCHANGEREQUEST没有处理完成前,函数重入,截获到此通知并顺利完成

4、WM_INPUTLANGCHANGE 在WM_INPUTLANGCHANGEREQUEST没有处理完成前,函数重入,截获到此消息并顺利完成
5、WM_IME_NOTIFY IMN_SETSENTENCEMODE 在WM_INPUTLANGCHANGEREQUEST没有处理完成前,函数重入,截获到此通知并顺利完成
6、WM_INPUTLANGCHANGEREQUEST END WM_INPUTLANGCHANGEREQUEST顺利处理结束

如果以上5个步骤都出现了,那么程序能继续正常运行,所有失去响应的情况都是在3之后就没有反映了,4、5、6无论等多久都不会出现,程序失去响应。

希望高手们不吝指教,谢谢
nonocast 2005-01-13
  • 打赏
  • 举报
回复
你能将程序发给我,我帮你调试看看
nonocast@citiz.net
chenzhou35 2005-01-13
  • 打赏
  • 举报
回复
顶~~~~~
Atomictry 2005-01-13
  • 打赏
  • 举报
回复
破紫光, 偶不用。 老受气!
chenzhou35 2004-12-28
  • 打赏
  • 举报
回复
UP一下
amziwei 2004-12-22
  • 打赏
  • 举报
回复
coolstar14(寒星溪月)
偶在 mozill里, 切换到微软拼音就经常不能输入.
再切换一遍输入法就好了, 这应该算不得大问题吧.

coolstar14(寒星溪月) 兄说到了 mozill, 我也觉得很奇怪:
我设了一个全局的键盘钩子, 但在 mozill 的输入窗口里按键盘键的时候, 钩子居然什么也没有钩到....
samp_miao 2004-12-22
  • 打赏
  • 举报
回复
我平时用紫光的时候就经常出问题,有时候按什么键都不响应。
应该是输入法的问题。
hony688 2004-12-22
  • 打赏
  • 举报
回复
关注!!!
chenzhou35 2004-12-22
  • 打赏
  • 举报
回复
呵呵,如果只是输入法出问题偶也就不管它了。问题是,现在导致使用这个编辑器的应用程序无响应,只能kill掉这个进程,所以,还必须得寻找办法解决它。
fengqinggao 2004-12-21
  • 打赏
  • 举报
回复
我也做过一个编辑器,用OnChar()、OnKeyDown()、OnKeyUp()三个函数处理了输入问题,一共写了10行代码,用输入法还好。

不过很佩服楼主,原来学过SDK吧,我只学过MFC,嘿嘿,就只能这么处理了。帮你顶
oyljerry 2004-12-21
  • 打赏
  • 举报
回复
紫光有时会自己出一些问题的,需要关闭后,重新打开
chenzhou35 2004-12-20
  • 打赏
  • 举报
回复
持续等待……
coolstar14 2004-12-20
  • 打赏
  • 举报
回复
偶在 mozill里, 切换到微软拼音就经常不能输入.
再切换一遍输入法就好了, 这应该算不得大问题吧.
老夏Max 2004-12-20
  • 打赏
  • 举报
回复
也许是紫光输入法自己也做了一些处理。我使用紫光输入法回帖的时候有时候也会造成无法输入,只能关闭以后再打开就好了,呵呵
zh_baiyu 2004-12-16
  • 打赏
  • 举报
回复
会不会是输入法不支持呢。。。。
加载更多回复(4)

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧