6

Using the following code

    [DllImport("user32.dll", EntryPoint = "GetWindowText", ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
    private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpWindowText, int nMaxCount);

    public static String GetWindowText(IntPtr hWnd)
    {
        StringBuilder title = new StringBuilder(MAX_TITLE_LENGTH);            
        int titleLength = WinAPI.GetWindowText(hWnd, title, title.Capacity + 1);
        title.Length = titleLength;
        return title.ToString();
    }

GetWindowText will hang (IE: never return) if passed a handle to a recently closed application. (Which is odd to me because I would have thought it would just return with a zero value)

Passing in random handle such as new IntPtr(123456) succeeds and returns with no value.

Could anyone please explain this behavior?

Maxim Gershkovich
  • 45,951
  • 44
  • 147
  • 243
  • Portions of the Windows source code were leaked a couple of years ago. If you're lucky you might be able to find a site that has a copy of it. Finding it back in the ~50 million lines of code will take some effort I imagine, assuming it was part of the leak. Let us know what you find. – Hans Passant Mar 26 '11 at 08:09
  • There are many things surrounding computing I have an inclination to do. I can assure you, that is not one of them. lol – Maxim Gershkovich Mar 26 '11 at 08:36
  • Are you sure this is not already a real handle? Also, can `123456` even be a real handle value, perhaps the API just flat out ignores it, maybe if considered invalid. – Chris O Mar 26 '11 at 13:09

2 Answers2

4

Read here a description of GetWindowText undercovers: The secret life of GetWindowText.

I don't think you'll ever get a better one :-) If you really want to be 100% sure you won't hang calling it, you need to do it on another thread that you can manage yourself (ie: kill if you need to)

Simon Mourier
  • 132,049
  • 21
  • 248
  • 298
  • That's an interesting article, but surely Raymond is talking about hung windows rather than destroyed ones? – David Heffernan Mar 26 '11 at 12:08
  • 1
    Here is a new link for mentioned article because the previous one isn't working: https://devblogs.microsoft.com/oldnewthing/20030821-00/?p=42833 – Anton Serov Nov 10 '22 at 06:34
1

It's impossible to answer this question in any meaningful way. The Win32 interface makes no guarantees about what happens when you pass invalid window handles to routines. It is an error to do so. Please refrain.

Having said all that, passing title.Capacity + 1 to GetWindowText is an error even with a valid window handle.

David Heffernan
  • 601,492
  • 42
  • 1,072
  • 1,490