怎样设置窗体为活动窗口并且可以接受按键消息?该怎么解决

怎样设置窗体为活动窗口并且可以接受按键消息?搜集了这么一堆api函数,发现怎么整都不管用。VB codePrivate

怎样设置窗体为活动窗口并且可以接受按键消息?
搜集了这么一堆api函数,发现怎么整都不管用。

VB code
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As LongPrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPrivate Declare Function SetActiveWindow Lib "user32" (ByVal hwnd As Long) As LongPrivate Declare Function SetFocusAPI Lib "user32" Alias "SetFocus" (ByVal hwnd As Long)


我的测试代码:
VB code
'添加一个text1、一个timer1设置延时为3秒Option ExplicitPrivate Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As LongPrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPrivate Declare Function SetActiveWindow Lib "user32" (ByVal hwnd As Long) As LongPrivate Declare Function SetFocusAPI Lib "user32" Alias "SetFocus" (ByVal hwnd As Long)Private Const WM_SYSCOMMAND = &H112Private Const SC_RESTORE = &HF120&Private Sub Timer1_Timer()    SendMessage Me.hwnd, WM_SYSCOMMAND, SC_RESTORE, Me.hwnd    SetForegroundWindow Me.hwnd    SetActiveWindow Me.hwnd    SetFocusAPI Me.hwnd    Text1.SetFocus    SendKeys "123"End Sub

测试方法:
启动程序后立刻随便点击一个程序作为活动窗口,然后看看上面代码在3秒到了后能不能正确设置自己为活动窗口并且接受SendKeys发送的字符串。

[解决办法]
VB code
'添加一个text1、一个timer1设置延时为3秒Option ExplicitPrivate Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As LongPrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPrivate Declare Function SetActiveWindow Lib "user32" (ByVal hwnd As Long) As LongPrivate Const WM_SYSCOMMAND = &H112Private Const SC_RESTORE = &HF120&Private Sub Timer1_Timer()    SendMessage Me.hwnd, WM_SYSCOMMAND, SC_RESTORE, Me.hwnd    SetForegroundWindow Me.hwnd    SetActiveWindow Me.hwnd    SetFocusAPI Me.hwnd    Text1.SetFocus    SendKeys "123"End Sub
[解决办法]
发现从某些全屏窗体切换过来,sendkey发送不成功,考虑是代码执行速度太快所致,修改下代码,让它有100ms的延时,测试通过。

VB code
Option ExplicitPrivate Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As LongPrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPrivate Declare Function SetActiveWindow Lib "user32" (ByVal hwnd As Long) As LongPrivate Declare Function SetFocusAPI Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As LongPrivate Const WM_SYSCOMMAND = &H112Private Const SC_RESTORE = &HF120&Dim i As LongPrivate Sub Form_Load()    Timer1.Interval = 100End SubPrivate Sub Timer1_Timer()    If i Mod 30 = 0 Then        SendMessage Me.hwnd, WM_SYSCOMMAND, SC_RESTORE, Me.hwnd        SetForegroundWindow Me.hwnd        SetActiveWindow Me.hwnd        SetFocusAPI Me.hwnd        Text1.SetFocus    End If    If i Mod 30 = 1 Then SendKeys i    If i Mod 30 = 22 Then Text1.Text = ""    If i > 10000 Then i = 0 Else i = i + 1End Sub
[解决办法]
发消息最好还是用PostMessage吧,后台传递消息,不影响你前台操作.

'如果只是设置文本内容应该有个API好像是Setwindowstext吧
------解决方案--------------------


下钩子,当捕获到按键消息是向指定的窗体发送按键消息即可。
[解决办法]
SetForegroundWindow 

貌似lz想做外挂。。。

如果不是,只是想共享前台按键,还可以考虑麻烦一点的AttachThreadInput 

还有想问。。。 怎么现在的回复内容的编辑窗口字体变成什么楷体了。。。。 是我浏览器的问题还是????
[解决办法]
我测试的没有问题呀
注意SetFocusAPI 的声明,后面应带&符号

VB code
Private Declare Function SetFocusAPI& Lib "user32" Alias "SetFocus" (ByVal hwnd As Long)