Solved

finding a window handle in VB (Visual Studio 2005)

Posted on 2008-06-09
5
589 Views
Last Modified: 2013-11-26
Hi,

I'm trying to figure out how to get the handle of a window that's already open.  I'm using

System.Diagnostics.Process.Start(file)

to load a file into Firefox. Can this give me back a handle?

I've also tried the attached code that I found online, written for VB 6, but I'm in VS 2005 and the line

wtl = GetWindowTextLength(lhWndP) + 1

gives me a runtime error of PInvoke and 'unbalanced stack'

Anybody have code that will find a window and that works in VS 2005?

Thanks!
Gene



Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
    Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, _
    ByVal cch As Long) As Long
    Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
    Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
 
    Private Const GW_HWNDNEXT = 2
 
    Private Sub Find_Browser_Window()
        Dim lhWndP As Long
        If GetHandleFromPartialCaption(lhWndP, " - Mozilla Firefox") = True Then
            MsgBox("Found Window Handle: " & lhWndP, vbOKOnly + vbInformation)
        Else
            MsgBox("Window ' - Microsoft Outlook' not found!", vbOKOnly + vbExclamation)
        End If
    End Sub
 
    Private Function GetHandleFromPartialCaption(ByRef lWnd As Long, ByVal sCaption As String) As Boolean
        Dim lhWndP As Long
        Dim sStr As String
        Dim wtl As Integer
        GetHandleFromPartialCaption = False
        lhWndP = FindWindow(vbNullString, vbNullString) 'PARENT WINDOW
        Do While lhWndP <> 0
            wtl = GetWindowTextLength(lhWndP) + 1
            Debug.Print("wtl = " & wtl & ", lhWndP = " & lhWndP)
            sStr = (GetWindowTextLength(lhWndP) + 1).ToString '& Chr(0)
            GetWindowText(lhWndP, sStr, Len(sStr))
            sStr = Microsoft.VisualBasic.Left(sStr, Len(sStr) - 1)
            If InStr(1, sStr, sCaption) > 0 Then
                GetHandleFromPartialCaption = True
                lWnd = lhWndP
                Exit Do
            End If
            lhWndP = GetWindow(lhWndP, GW_HWNDNEXT)
        Loop
    End Function

Open in new window

0
Comment
Question by:ugeb
  • 2
  • 2
5 Comments
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 21747382
if you launch the application with Process.Start, you can try with this:

Dim p as Process = System.Diagnostics.Process.Start(file)
Dim h as IntPtr = p.MainWindowHandle

0
 
LVL 11

Author Comment

by:ugeb
ID: 21747442
Hi,

Thanks for the response.  I'm getting the error:

Object reference not set to an instance of an object.

It looks like p is not being set.  Usually the Firefox browser is already running, does that affect it?  How would I get the handle of a process already running?
0
 
LVL 55

Accepted Solution

by:
Jaime Olivares earned 300 total points
ID: 21747503
try with this static method: System.Diagnostics.Process.GetProcessesByName()

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.getprocessesbyname.aspx
0
 
LVL 14

Assisted Solution

by:rachitkohli
rachitkohli earned 200 total points
ID: 21768431
Dim i as long = System.Diagnostics.Process.Start(file).Handle
0
 
LVL 11

Author Closing Comment

by:ugeb
ID: 31465578
Still had problems, but have moved on.  This points me in the right direction.  Thanks!
0

Featured Post

Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Today I had a very interesting conundrum that had to get solved quickly. Needless to say, it wasn't resolved quickly because when we needed it we were very rushed, but as soon as the conference call was over and I took a step back I saw the correct …
Since upgrading to Office 2013 or higher installing the Smart Indenter addin will fail. This article will explain how to install it so it will work regardless of the Office version installed.
The viewer will learn how to use NetBeans IDE 8.0 for Windows to connect to a MySQL database. Open Services Panel: Create a new connection using New Connection Wizard: Create a test database called eetutorial: Create a new test tabel called ee…
The viewer will learn how to use and create new code templates in NetBeans IDE 8.0 for Windows.

772 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question