Dilan Shaminda Ответов: 2

Функция Getwindowtext всегда возвращает null


Я использую функции Win32 API для регистрации текущей программы в цепочке буфера обмена. Ниже функция извлекает дескриптор окна текущего владельца буфера обмена. Проблема GetCaptionOfWindow всегда возвращайте null.

[DllImport("user32.dll")]
 public static extern IntPtr GetClipboardOwner();



Вызов PInvoke подпись

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern int GetWindowText(IntPtr hWnd, [Out] StringBuilder lpString, int nMaxCount);

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern int GetWindowTextLength(IntPtr hWnd);


Что я уже пробовал:

IntPtr ClipboardOwnerHandler = GetClipboardOwner();
строка windowTitle = GetCaptionOfWindow(ClipboardOwnerHandler );

private string GetCaptionOfWindow(IntPtr hwnd)
        {
            string caption = "";
            StringBuilder windowText = null;
            try
            {
                int max_length = WindowsApiManager.GetWindowTextLength(hwnd);
                windowText = new StringBuilder("", max_length + 5);
                WindowsApiManager.GetWindowText(hwnd, windowText, max_length + 2);

                if (!String.IsNullOrEmpty(windowText.ToString()) && !String.IsNullOrWhiteSpace(windowText.ToString()))
                    caption = windowText.ToString();
            }
            catch (Exception ex)
            {
                caption = ex.Message;
            }
            finally
            {
                windowText = null;
            }
            return caption;
        }

2 Ответов

Рейтинг:
2

Richard MacCutchan

То Функция GetWindowText (Windows)[^] требует, чтобы второй параметр был адресом буфера памяти. Вы передаете ссылку s StringBuilder.


Dilan Shaminda

Я получил сигнатуру метода от pinvoke.net кажется, это правильно
https://www.pinvoke.net/default.aspx/user32/GetWindowText.html

Richard MacCutchan

Я не понимаю, как это может сработать. Неуправляемый код не понимает тип StringBuilder.

Ладно, я исправился, я просто попробовал этот код, и он отлично сработал.

Рейтинг:
0

Mehdi Gholam

Читать это : как получить GetWindowText[^]


Dilan Shaminda

Спасибо за ссылку. Я использую P/Invoke, и мой вопрос заключается в том, почему он всегда возвращает null? Я отладил код, но не смог найти ошибку