Почему GetWindowText зависает с «закрытой» ручкой, а не со случайной - PullRequest
4 голосов
/ 26 марта 2011

Используя следующий код

    [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 будет зависать (IE: никогда не возвращаться), если передать дескриптор недавно закрытому приложению. (Что странно для меня, потому что я бы подумал, что он просто вернется с нулевым значением)

Передача в случайном дескрипторе, таком как new IntPtr(123456), завершается успешно и возвращается без значения.

Может ли кто-нибудь объяснить это поведение?

Ответы [ 2 ]

1 голос
/ 26 марта 2011

Прочитайте здесь описание нижестоящих элементов GetWindowText: Тайная жизнь GetWindowText .

Не думаю, что ты когда-нибудь получишь лучшее :-) Если вы действительно хотите быть на 100% уверены, что не повесьте вызов, вам нужно сделать это в другом потоке, которым вы можете управлять сами (например: убить, если вам нужно)

0 голосов
/ 26 марта 2011

На этот вопрос невозможно ответить сколько-нибудь осмысленно. Интерфейс Win32 не дает никаких гарантий относительно того, что происходит, когда вы передаете недопустимые дескрипторы окна подпрограммам. Это ошибка. Пожалуйста, воздержитесь.

Сказав все это, передача title.Capacity + 1 в GetWindowText является ошибкой даже при наличии правильного дескриптора окна.

...