2013-07-09 40 views
1

我有一個在系統托盤中運行的應用程序,當用戶按下梳妝按鈕時,它顯示一個WinForm以填寫併發送電子郵件。一切正常,但顯示WinForm時的部分。它顯示在頂部,焦點似乎在文本框中,但窗口不活動。將焦點設置爲新的彈出窗口

用於調用Popup表單的代碼。在彈出的形式

Private Sub frmPopup_Shown(sender As Object, e As EventArgs) Handles Me.Shown 
    Activate() 
    BringToFront() 
End Sub 

Private Sub frmPopup_Load(sender As Object, e As EventArgs) Handles Me.Load 
    TextBoxName.Focus() 
End Sub 

真正踢在褲子上

My.Forms.frmpopup.ShowDialog() 

代碼是這個,只要用戶沒有目前主要集中在Internet Explorer窗口的工作。如果我找到解決方案,我會發布它。


它似乎將兩個Subs合併成一個子組修復問題,我會繼續測試。

私人小組frmPopup_Shown(發送者爲對象,E作爲EventArgs的)把手 Me.Shown 激活() BringToFront() TextBoxName.Focus()結束小組

+1

'的ShowDialog()'節目帶來窗體頂部並激活它,這是一個奇怪的問題。 –

+0

你試過Me.TopMost = True嗎? – varocarbas

+0

是的,winform會顯示,I符號會在文本框中閃爍,但活動焦點和鍵盤輸入將位於彈出窗口下方的窗口中。 – Landmine

回答

1

確保您的應用程序重點以及...

包括以下進口...

<Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True, CharSet:=Runtime.InteropServices.CharSet.Auto)> _ 
Private Shared Function SetForegroundWindow(ByVal hWnd As IntPtr) As Long 
End Function 

你打電話彈出之前,或從彈出LOAD事件中,調用

SetForegroundWindow(Me.Handle) 
1

SendToTop(true)應該把窗口最頂層。

Private Const SWP_NOSIZE As Integer = &H1 
Private Const SWP_NOMOVE As Integer = &H2 

Private Shared ReadOnly HWND_TOPMOST As New IntPtr(-1) 
Private Shared ReadOnly HWND_NOTOPMOST As New IntPtr(-2) 
Public Declare Function SetWindowPos Lib "user32" (ByVal hWnd As IntPtr, ByVal hWndInsertAfter As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As Integer) As Boolean 

Public Sub SendToTop(toTop As Boolean) 
    If toTop Then 
     SetWindowPos(Me.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE) 
    Else 
     SetWindowPos(Me.Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE) 
    End If 
End Sub 
1

只使用Active();在彈出的Load事件

相關問題