Why does GetWindowText hang with a “closed” handle but not with a random one

与世无争的帅哥 提交于 2020-01-11 09:21:07

问题


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?


回答1:


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)




回答2:


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.



来源:https://stackoverflow.com/questions/5440629/why-does-getwindowtext-hang-with-a-closed-handle-but-not-with-a-random-one

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!