欢迎来到天天文库
浏览记录
ID:41708430
大小:110.18 KB
页数:4页
时间:2019-08-30
《实现软键盘的几个关键技术介绍》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、C#实现软键盘的几个关键技术介绍在嵌入式应川和一些安全软件中经常需要不通过物理键盘输入,虽然微软提供了也一个软键盘,但这个软件盘不能定制界血不能自动感应当前光标是否处于输入状态,所以有时候我们还是需要自己來实现这个软键盘。木文将讲解自己实现软键盘时涉及到的几个关键技术。一、浮动窗体的实现软键盘的窗体和普通窗体不一样,这个窗体在成为当前窗体吋,不会影响其它进程的窗体的光标焦点。也就是说虽然这个窗体现在为当前激活的前台窗体,但光标仍然停在其他进程的窗体上。如上图所示,虽然软键盘在记事本的前面,但光标
2、仍然在记事本上。要实现这个技术,我们必须要把当前窗体设直为浮动工具条才行。这里我给出C#Winform的实现方法:privateconstintWS_EX_TOOLWINDOW=0x00000080;privateconstintWS_EX_NOACTIVATE=0x08000000;protectedoverrideCreateParamsCreateParams{get{CreateParamscp=base.CreateParams;cp.ExStyle
3、=(WS_EX_NOACTIVAT
4、E
5、WS_EX_TOOLWINDOW);cp・Parent=IntPtr.Zero;//KeepthislineonlyifyouusedUserControlreturncp;//returnbase.CreateParams;}}如上代码就是将Winform指定为浮动工具条窗体。只要在winform的类中重载CreateParams函数,并按上述代码编写就可以了。二、如何检测当前处于输入状态在一些嵌入式设备中,我们没冇物理键盘,所冇的输入都是通过触摸屏和软键盘输入。那么这个时候,我们必须要做
6、到只有处于输入状态时才弹出软键盘,否则如果软键盘一直在界面上,既不美观也妨碍其他程序的正常使用。要实现这个功能,我们能想到的最直接的方法是windows是否会在当前处于输入状态下时发一个什么事件,或者通过什么钩子程序來实现。但我研究了很久,没有找到这种方法。如果哪位知道这种方法,不妨在回复中告诉我。我目询找到的方法是定吋询问windows的当前窗体是否处于输入状态。IntPtrhWnd=GetForegroundWindow();uintprocessld;uintthreadid=GetWin
7、dowThreadProcessId(hWnd,outprocessld);GUITHREADINFOlpgui=newGUITHREADINFO();lpgui.cbSize=Marshal>SizeOf(lpgui);if(GetGUIThreadlnfo(threadid^,reflpgui)){if(lpgui.hwndCaret!=0){returnhWnd;}}如上面代码所示首先我们通过GetForegroundWindowsAPI得到为前窗体的句柄。然后我们再通过GetGUIThr
8、eadlnfo得到当前窗体的一些屈性。这些屈性在GUITHREADINFO屮定义publicstructGUITHREADINFO{publicpublicpublicpublicpublicpublicpublicpublicpublic}intintintintintintintintcbSize;flags;hwndActive;hwndFocus;hwndCapture;hwndMenuOwner;hwndMoveSize;hwndCaret;System・Drawing・Rectang
9、lercCaret;上而是GUITHREADINFO结构。我们可以通过这个信息得到当前窗体中当前焦点的子窗口句柄,当前获得光标的子窗口句柄,当前正激活的子窗体句柄等等。这里我们只要用到当前获得光标的子窗口句柄,就是hwndCaret。如果hwndCaret不为0,则表示当前窗体处于可输入状态。相关API函数的C#定义如下:[Dlllmport(“user32・dll”)][return:MarshalAs(UnmanagedType.Bool)]publicstaticexternboolGet
10、GUIThreadlnfo(uintidThread^refGUITHREADINFOlpgui);[Dlllmport(“user32・dll”)]publicstaticexternIntPtrGetForegroundWindow();[Dlllmport("user32
此文档下载收益归作者所有