Form1:Private Sub TextBox1_GotFocus()
    Me.Hide
    Me.Enabled = False
    Form2.Show
    Form2.SetFocus
End SubForm2:
Private Sub Form_Activate()
    Me.SetFocus
    TextBox1.SetFocus
    'MsgBox "!"
End Sub如果没有msgbox的话,Form2虽然看起来获得了焦点,但是不能操作,必须点击任务栏上的图标再次获得焦点才能操作。但是如果有Msgbox的话,却可以直接获得焦点。我的问题是,我的代码是否有问题,怎么样才能直接获得焦点?

解决方案 »

  1.   

    这是操作系统的特性,禁止普通窗体获得焦点(只能在任务栏上闪烁)。
    如果你用 Win98 就是直接获得焦点的。
      

  2.   

    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 Subapi和常数声明自己去api工具里复制
      

  3.   


    非常感谢,我试试!不过我找到了出现问题的原因是GotFocus的问题,如果换成MouseUp或者DblClick就没有问题,我再看看!
      

  4.   

    我在VB6的IDE下试了一下,楼主的那段代码也没有问题啊,跟“预期效果”一样。
    (不用MsgBox那一句)并且 Form2.SetFocus 这一句也是可以省略的。
    鼠标点击 Form1的TextBox或者按键盘TAB键让TextBox1得到焦点,
    Form1就马上消失、弹出Form2, Form2中的TextBox1上光标闪烁、可以直接接受键盘输入。
      

  5.   

    加上一句,form2.TextBox1.SetFocus
      

  6.   

     
    SetFocus 方法
          将焦点移至指定的控件或窗体。语法object.SetFocusobject 所在处代表对象表达式,其值是“应用于”列表中的一个对象。说明对象必须是 Form 对象、MDIForm 对象或者能够接收焦点的控件。调用 SetFocus 方法以后,任何的用户输入将指向指定的窗体或控件。焦点只能移到可视的窗体或控件。因为在窗体的 Load 事件完成前窗体或窗体上的控件是不可视的,所以如果不是在 Form_Load 事件过程完成之前首先使用 Show 方法显示窗体的话,是不能使用 SetFocus 方法将焦点移至正在自己的 Load 事件中加载的窗体的。也不能把焦点移到 Enabled 属性被设置为 False 的窗体或控件。如果已在设计时将 Enabled 属性设置为 False,必须在使用 SetFocus 方法使其接收焦点前将 Enabled 属性设置为 True。