Show窗体不能取得焦点的问题

狼魇 2017-06-30 10:46:48
Form1:

Private Sub TextBox1_GotFocus()
Me.Hide
Me.Enabled = False
Form2.Show
Form2.SetFocus
End Sub

Form2:
Private Sub Form_Activate()
Me.SetFocus
TextBox1.SetFocus
'MsgBox "!"
End Sub


如果没有msgbox的话,Form2虽然看起来获得了焦点,但是不能操作,必须点击任务栏上的图标再次获得焦点才能操作。但是如果有Msgbox的话,却可以直接获得焦点。

我的问题是,我的代码是否有问题,怎么样才能直接获得焦点?
...全文
533 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-07-10
  • 打赏
  • 举报
回复
SetFocus 方法 将焦点移至指定的控件或窗体。 语法 object.SetFocus object 所在处代表对象表达式,其值是“应用于”列表中的一个对象。 说明 对象必须是 Form 对象、MDIForm 对象或者能够接收焦点的控件。调用 SetFocus 方法以后,任何的用户输入将指向指定的窗体或控件。 焦点只能移到可视的窗体或控件。因为在窗体的 Load 事件完成前窗体或窗体上的控件是不可视的,所以如果不是在 Form_Load 事件过程完成之前首先使用 Show 方法显示窗体的话,是不能使用 SetFocus 方法将焦点移至正在自己的 Load 事件中加载的窗体的。 也不能把焦点移到 Enabled 属性被设置为 False 的窗体或控件。如果已在设计时将 Enabled 属性设置为 False,必须在使用 SetFocus 方法使其接收焦点前将 Enabled 属性设置为 True。
groundsky 2017-07-09
  • 打赏
  • 举报
回复
加上一句,form2.TextBox1.SetFocus
狼魇 2017-06-30
  • 打赏
  • 举报
回复
引用 2 楼 sysdzw 的回复:
Public Sub myFocus(hWnd&)
    Dim hWnd&, hForeWnd&, dwForeID&, dwCurID&
    hForeWnd = GetForegroundWindow()
    dwForeID = GetWindowThreadProcessId(hForeWnd, 0)
    dwCurID = GetCurrentThreadId()
    AttachThreadInput dwCurID, dwForeID, True
    SetWindowPos hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE + SWP_NOMOVE
    SetWindowPos hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE + SWP_NOMOVE
    SetForegroundWindow hWnd
    AttachThreadInput dwCurID, dwForeID, False
End Sub
api和常数声明自己去api工具里复制
非常感谢,我试试! 不过我找到了出现问题的原因是GotFocus的问题,如果换成MouseUp或者DblClick就没有问题,我再看看!
无·法 2017-06-30
  • 打赏
  • 举报
回复
Public Sub myFocus(hWnd&)
Dim hWnd&, hForeWnd&, dwForeID&, dwCurID&
hForeWnd = GetForegroundWindow()
dwForeID = GetWindowThreadProcessId(hForeWnd, 0)
dwCurID = GetCurrentThreadId()
AttachThreadInput dwCurID, dwForeID, True
SetWindowPos hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE + SWP_NOMOVE
SetWindowPos hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE + SWP_NOMOVE
SetForegroundWindow hWnd
AttachThreadInput dwCurID, dwForeID, False
End Sub
api和常数声明自己去api工具里复制
Tiger_Zhao 2017-06-30
  • 打赏
  • 举报
回复
这是操作系统的特性,禁止普通窗体获得焦点(只能在任务栏上闪烁)。 如果你用 Win98 就是直接获得焦点的。
舉杯邀明月 2017-06-30
  • 打赏
  • 举报
回复
我在VB6的IDE下试了一下,楼主的那段代码也没有问题啊,跟“预期效果”一样。 (不用MsgBox那一句) 并且 Form2.SetFocus 这一句也是可以省略的。 鼠标点击 Form1的TextBox或者按键盘TAB键让TextBox1得到焦点, Form1就马上消失、弹出Form2, Form2中的TextBox1上光标闪烁、可以直接接受键盘输入。

7,759

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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