自制一个软键盘,一个难点,点击这个软键盘时,焦点还在原来的软件上

wzckr 2010-12-09 11:41:39
比如说这个软键盘,用的命令是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前把当前程序切换到最后的那个程序上,应该就可以了,
还有一个方法当然是最好的,就是有没有什么办法,让我在点击软件键盘时不会把软健盘切换到当前,也就是说点击软键盘,可是焦点还在原来的程序上,比如说文本,这样就可以了,如果说不切换到软键盘上没有办法触发键盘事件,不知道是按的是哪个键,这个没关系,我可以通过鼠标的位置来确定当前按的是什么键
...全文
474 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wqs12ec056 2011-05-04
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 mstop 的回复:]
弄这么复杂干嘛?
把OSK.EXE作为资源一起打包.用时把它放出来.
[/Quote]

傻帽,OSK.exe也是人写的,人家想研究这个怎么写。
华芸智森 2011-05-03
  • 打赏
  • 举报
回复
弄这么复杂干嘛?
把OSK.EXE作为资源一起打包.用时把它放出来.
MarionLemon 2011-04-30
  • 打赏
  • 举报
回复
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


窗体不抢焦点。
dylike 2010-12-17
  • 打赏
  • 举报
回复
VB声明
Declare Function SetActiveWindow Lib "user32" Alias "SetActiveWindow" (ByVal hwnd As Long) As Long
说明
激活指定的窗口
返回值
Long,前一个活动窗口的句柄
参数表
参数 类型及说明
hwnd Long,待激活窗口的句柄

获取上一次被激活的窗口
colorall 2010-12-10
  • 打赏
  • 举报
回复
... ...

SetWindowLong(this.Handle, GWL_EXSTYLE, GetWindowLong(this.Handle, GWL_EXSTYLE) | NativeMethods.WS_DISABLED)

在OnActivated加上,就不抢焦点
colorall 2010-12-09
  • 打赏
  • 举报
回复
用这种方法C#刚做完一个,绝对能实现的
colorall 2010-12-09
  • 打赏
  • 举报
回复
gdi+自画键盘
结合这样使用API
SetWindowLong(hwnd,GWL_STYLE,(GetWindowLong(hwnd,GWL_STYLE)&(~WS_DISABLED)));
就可实现
tzwsoho 2010-12-09
  • 打赏
  • 举报
回复
用钩子吧,WH_SHELL钩子,然后拦截nCode=HSHELL_WINDOWREPLACED,wParam是焦点转换前的窗体句柄,lParam是焦点转换后的窗体句柄

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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