winforms 从任务计划程序运行应用程序时,窗口未激活

qeeaahzv  于 2022-12-27  发布在  其他
关注(0)|答案(2)|浏览(173)

在我的应用程序中,我试图聚焦一个文本框,这样我就可以在表单加载后直接输入。
Form显示时,我可以看到TextBox中的光标 Flink ,但如果我键入一些内容,什么也不会发生。
我需要单击窗口开始在TextBox中输入文本。如果我从Visual Studio正常运行我的应用程序,它将完美地工作,但如果我的应用程序使用任务计划程序运行,则会发生这种情况。
你有什么建议吗?
下面是我的代码:

this.TopMost = true;
textbox.Focus();

我也试过textbox.Select();,但它不工作。

tez616oj

tez616oj1#

问题是:当应用程序通过任务调度程序操作运行时,主窗口显示为非活动状态,系统通知用户在任务栏中 Flink 应用程序的图标。这是 * 设计
一个简单的解决方法是在窗体设计器中设置启动窗口的WindowState=FormWindowState.Minimized,然后在窗口完成加载其内容并准备好显示后将其重新设置为
*FormWindowState.Normal,从而引发Shown事件。
设置FormWindowState.Normal会导致调用ShowWindow,其中nCmdShow设置为
SW_SHOWNORMAL**:

    • 激活并显示窗口**。如果窗口最小化或最大化,系统会将其恢复到原始大小和位置。应用程序应在第一次显示窗口时指定此标志。

窗口现在照常显示,处于活动状态并准备接收输入。
此外,代码使用ActiveControl属性显式设置应接收输入的Control。
我建议将Shown处理程序设置为async,并在重新设置WindowState属性之前添加一个小延迟,以防止任务栏图标陷入 Flink 状态。
如果窗口需要重新定位或调整大小,则需要在重置WindowState后进行,因为在此之前窗口处于最小化状态,不会缓存位置和大小值。
表单的StartPosition应设置为FormStartPosition.Manual

private async void MainForm_Shown(object sender, EventArgs e)
{
    await Task.Delay(500);
    this.WindowState = FormWindowState.Normal;
    this.ActiveControl = [A Control to activate];
}
pcrecxhr

pcrecxhr2#

我的解决方案基于Jimi答案,但使用Windows API时,无需在窗体设计器中设置Form WindowState属性。

''' <summary>
''' Focuses and brings a window to the foreground
''' </summary>
''' <param name="hwnd">The Window handle</param>
''' <param name="errInfo">Returns error information if any</param>
''' <returns>Returns True if the function succeeded otherwise returns False</returns>
Public Shared Function FocusWindow(hwnd As Integer, ByRef errInfo As Exception) As Boolean

    Try

        If hwnd <= 0 Then Throw New ArgumentException("Invalid window handle.", NameOf(hwnd))

        Dim pHandle = New IntPtr(hwnd)

        ShowWindow(pHandle, ShowWindowEnum.ShowMinimized)
        ShowWindow(pHandle, ShowWindowEnum.ShowNormal)

        If SetForegroundWindow(hwnd) Then
            Return True
        Else
            Throw New Win32Exception(Marshal.GetLastWin32Error, "Win32 method SetForegroundWindow failed.")
        End If

    Catch ex As Exception
        errInfo = ex
        Return False
    End Try

End Function

<DllImport("user32.dll")> Friend Shared Function ShowWindow(hWnd As IntPtr, flags As ShowWindowEnum) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function

<DllImport("User32.dll", EntryPoint:="SetForegroundWindow", SetLastError:=True)> Friend Shared Function SetForegroundWindow(hWnd As Integer) As Boolean
End Function

Friend Enum ShowWindowEnum

    Hide = 0
    ShowNormal = 1
    ShowMinimized = 2
    ShowMaximized = 3
    ShowNormalNoActivate = 4
    Show = 5
    Minimize = 6
    ShowMinNoActivate = 7
    ShowNoActivate = 8
    Restore = 9
    ShowDefault = 10
    ForceMinimized = 11

End Enum

用途

Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown

    If Handle <> IntPtr.Zero Then
        Dim errInfo As Exception = Nothing
        FocusWindow(CInt(Handle), errInfo)
    End If

End Sub

相关问题