开发者

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

开发者 https://www.devze.com 2023-02-19 16:54 出处:网络
Using the following code [DllImport(\"user32.dll\", EntryPoint = \"GetWindowText\", ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]

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 stat开发者_如何学Cic 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?


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)


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消