[英]Set focus to new popup winform
我有一個在系統托盤中運行的應用程序,當用戶按下按鈕時,它會顯示一個要填寫的 WinForm 並發送電子郵件。 一切都很好,但顯示 WinForm 時的部分。 它顯示在頂部,焦點似乎在文本框上,但該窗口未處於活動狀態。
用於調用 Popup 窗體的代碼。
My.Forms.frmpopup.ShowDialog()
彈出窗體上的代碼
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
真正令人振奮的是,只要用戶當前不專注於 Internet Explorer 窗口,它就可以工作。 如果我找到解決方案,我會發布它。
似乎將兩個 Sub 合並為一個 Sub 可以解決問題,我將繼續測試。
Private Sub frmPopup_Shown(sender As Object, e As EventArgs) 處理 Me.Shown Activate() BringToFront() TextBoxName.Focus() End Sub
確保您的應用程序也具有焦點......
包括以下導入...
<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)
SendToTop(true)
應該將窗口帶到TopMost。
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
只需使用Active();
在彈出加載事件上
在我的用例*中,以下顯示了所需的結果:
popup.Show();
popup.Activate();
其中popup: Form
。 不知道為什么必須在Show()
方法之后調用Activate()
,但事實證明它可以正常工作。
用例
我的用例顯示彈出窗口和加載程序表單。 彈出窗口和加載器都是頂級表單, ShowDialog()
方法觸發。 它們在單獨的線程中執行,其想法是在彈出窗體獲取其數據時顯示加載程序窗體。 一旦完成長操作(即獲取),加載程序窗體關閉並顯示彈出窗體。
一切都按描述進行,除了加載程序關閉后彈出窗口沒有聚焦。
給定的兩行代碼正在解決我的問題,現在一切都按預期工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.