自制一个软键盘,一个难点,点击这个软键盘时,焦点还在原来的软件上
比如说这个软键盘,用的命令是API的keybd_event,还有一个已经打开的文本,我现在是想点击软键盘上的一个键,比如说A,这个A就会在文本中输入
现在问题的,我一点软键盘,那当前程序就会切换到软件键盘上,这个A就没有办法在文本中输入,我本来想到一种方法解决就是当点击软键盘后,先把文本切换回前台,然后再执行keybd_event,这倒是可以让A输入到文本上,这样就又个问题,我要先知道输入的软件是什么,比如说文本,因为我用的是SetForegroundWindow这个API,
代码为
For Each Myprocess As Process In Process.GetProcesses
If Myprocess.ProcessName = "WINWORD" Then
SetForegroundWindow(Myprocess.MainWindowHandle)
System.Threading.Thread.Sleep(100)
keybd_event(d_Int(i) - 1000, 0, 0, 0)
Exit For
End If
Next
比如说我知道要在word里面输入,还有word还只能打开一个,这样就很不方便,因为从这个软键盘上取得输入内容的软件不确定的,比如说可能是文本,或word,或某个软件的输入框。
所以我想问一下有没有办法解决:
我想到二个方法:一个是能找点击键盘前最后一个当前程序,比如说我要把内容输入到文本,那我点击健盘前的当前程序一定会是这个文本,光标也会在文本的输入位置,所以只要找到最后一个当前程序,到时候在执行keybd_event前把当前程序切换到最后的那个程序上,应该就可以了,
还有一个方法当然是最好的,就是有没有什么办法,让我在点击软件键盘时不会把软健盘切换到当前,也就是说点击软键盘,可是焦点还在原来的程序上,比如说文本,这样就可以了,如果说不切换到软键盘上没有办法触发键盘事件,不知道是按的是哪个键,这个没关系,我可以通过鼠标的位置来确定当前按的是什么键
[解决办法]
用钩子吧,WH_SHELL钩子,然后拦截nCode=HSHELL_WINDOWREPLACED,wParam是焦点转换前的窗体句柄,lParam是焦点转换后的窗体句柄
[解决办法]
gdi+自画键盘
结合这样使用API
SetWindowLong(hwnd,GWL_STYLE,(GetWindowLong(hwnd,GWL_STYLE)&(~WS_DISABLED)));
就可实现
[解决办法]
用这种方法C#刚做完一个,绝对能实现的
[解决办法]
http://www.cnblogs.com/SunYu/archive/2010/04/29/1723813.html
http://topic.csdn.net/u/20100903/10/df00f179-6675-4641-98d5-fc7a47f1356d.html
[解决办法]
... ...
SetWindowLong(this.Handle, GWL_EXSTYLE, GetWindowLong(this.Handle, GWL_EXSTYLE) | NativeMethods.WS_DISABLED)
在OnActivated加上,就不抢焦点
[解决办法]
VB声明
Declare Function SetActiveWindow Lib "user32" Alias "SetActiveWindow" (ByVal hwnd As Long) As Long
说明
激活指定的窗口
返回值
Long,前一个活动窗口的句柄
参数表
参数 类型及说明
hwnd Long,待激活窗口的句柄
获取上一次被激活的窗口
[解决办法]
Public Partial Class Form1
Inherits Form
Protected Overrides ReadOnly Property CreateParams() As CreateParams
Get
Dim cp As CreateParams = MyBase.CreateParams
cp.ExStyle = cp.ExStyle Or CInt(&H8000000L)
'把窗体设置成WS_EX_NOACTIVATE样式
Return cp
End Get
End Property
Public Sub New()
Me.TopMost = True
InitializeComponent()
End Sub
Private Sub button1_Click(sender As Object, e As EventArgs)
SendKeys.Send("A")
End Sub
End Class
窗体不抢焦点。
[解决办法]
弄这么复杂干嘛?
把OSK.EXE作为资源一起打包.用时把它放出来.
[解决办法]