如果发生错误,启动应用程序并“强制”关注?

时间:2015-03-25 12:44:01

标签: vb.net

我的运输部门使用了扩展程序。用户扫描纸箱,处理一些数据库处理,并将识别该纸箱的记录插入"队列"表。缩放程序还启动一个单独的.exe,它处理标签处理(调用FedEx或UPS,或根据需要构建自定义ZPL,然后发送到连接到机器的打印机)。这些PC是Windows 7,如果这有所不同。

有时,错误的数据会导致标签程序出错。我们最近发现,当其中一位客户下订单时,我们的一位客户不需要有效的电话号码,如果纸箱最终需要发送需要电话号码的FedEx Home Delivery或SmartPost,则API会返回错误。< / p>

打印标签程序的错误消息会在缩放程序后面弹出。有没有办法强制从打印标签程序的错误消息到任何其他打开的窗口的顶部?

编辑:我正在调用标签程序,首先检查是否存在使用.exe名称运行的进程。如果没有,它会调用一个启动器实用程序,该实用程序在我们的应用服务器上查看是否有更新的exe,并且如果是,则复制到c:\ tmp目录。然后运行该机器程序的本地c:\ tmp副本。

1 个答案:

答案 0 :(得分:0)

实现此目的的一种方法是将错误表单设置为TopMost窗口。如果您总是希望表单高于所有其他窗口(包括其他进程的窗口),请将其添加到表单中:

Private Const WS_EX_TOPMOST As Integer = &H00000008

Protected Overrides ReadOnly Property CreateParams() As CreateParams
    Get
        Dim cp As CreateParams = MyBase.CreateParams
        cp.ExStyle = cp.ExStyle Or WS_EX_TOPMOST
        Return cp
    End Get
End Property

此代码覆盖窗口的CreateParams,添加TOPMOST标志。在此之后你不必做任何事情 - 窗口永远是最顶层的。

您还可以使用p / Invoke SetWindowPos按需按需显示窗口:

<DllImport("user32.dll", SetLastError:=True)>
Private Shared Function SetWindowPos(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
End Function

Private Shared ReadOnly HWND_TOPMOST As New IntPtr(-1)
Private Shared ReadOnly HWND_NOTOPMOST As New IntPtr(-2)

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

Public Sub SetWindowAsTopMost()
    SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
End Sub