Notifying users when a long running process is ready

I was forced to delve into the world of Win32 coding to solve an issue of calling the SaveFileDialog method. I have a long-running WPF application that I wanted to get the user’s attention when it was finally ready for some love (i.e. the Save File dialog box appeared). I was having an issue where the app would quietly sit there until the user decided to check it – not the kind of passive relationship I was looking for. I needed to spice it up.

Luckily, I found the solution to shy application.

First, add a few DllImport statements to delve into the user32.dll file:

    <Runtime.InteropServices.DllImport("user32.dll")> _
    Private Shared Function ShowWindow(ByVal hwnd As Integer, ByVal nCmdShow As Integer) As Integer
    End Function
    <Runtime.InteropServices.DllImport("user32.dll")> _
    Private Shared Function SetForegroundWindow(ByVal hwnd As Integer) As Integer
    End Function
    <Runtime.InteropServices.DllImport("user32.dll")> _
    Private Shared Function IsIconic(ByVal hWnd As Integer) As Integer
    End Function

The meat of the code is this For Each loop. The only modification you will have to make is to change the MainWindowTitle to match the result of the window you want to give focus to:

        'Give focus to the dialog box when it is ready
        For Each p As Process In Process.GetProcesses
            If p.MainWindowTitle = "Results" Then
                If IsIconic(p.MainWindowHandle.ToInt32) <> 0 Then
                    ShowWindow(p.MainWindowHandle.ToInt32, &H1)
                Else
                    SetForegroundWindow(p.MainWindowHandle.ToInt32)
                End If
            End If
        Next

If you are interested in the internals of the calls, you can check MSDN for the IsIconic, ShowWindow and SetForegroundWindow functions.

  1. Leave a comment

Leave a comment