2016-03-28 2 views
0

Здравствуйте, я так недавно программировал на C++. Обратите внимание, что я компилирую с использованием -std = C++ 11, который проверяется, и используйте Code :: Blocks с компилятором MingW, потому что для этого требуется какая-то программа.Получение текста Windows на C++?

Мой вопрос прост: может ли кто-нибудь предоставить мне функцию, чтобы получить текст панели ввода? Я спрашиваю об этом, потому что я не могу найти рабочие реализации WM_GETTEXT или GetWindowText.

Edit:

У меня есть эти ошибки:

||=== Build: Release in ElitezLua (compiler: GNU GCC Compiler) ===| C:\Users\PC\Desktop\ElitezLua\Main.cpp||In function 'std::string GetText(HWND, int)':| C:\Users\PC\Desktop\ElitezLua\Main.cpp|35|error: cannot convert 'wchar_t*' to 'LPSTR {aka char*}' for argument '2' to 'int GetWindowTextA(HWND, LPSTR, int)'|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 4 second(s)) ===|

Используя этот код:

string GetText(HWND Box, int THN) { 
    int Length = GetWindowTextLength(GetDlgItem(Box, THN)); 
    wchar_t * Text = new wchar_t[Length + 1]; 
    return GetWindowText(GetDlgItem(Box, THN), Text, (Length + 1)); 
}; 

(Ошибка на обратной линии)

+1

, что пользовательский интерфейс вы с помощью? – Samer

+0

Что это значит?Я не понимаю, новичок в программировании. –

+0

MFC? wxWidget? QT? – Samer

ответ

0

Сначала получите длину текста:

int l = GetWindowTextLength(GetDlgItem(hWnd, ID_OF_YOUR_CONTROL)); 

Теперь получить текст (hWnd является обработчик окна, который содержит элемент управления):

wchar_t* txt = new wchar_t[l + 1]; 
GetWindowText(GetDlgItem(hWnd, ID_OF_YOUR_CONTROL), txt, l + 1); 

Я надеюсь, что это поможет вам

Edit ------

std::wstring GetText(HWND Box, int THN) { 
    int Length = GetWindowTextLength(GetDlgItem(Box, THN)); 
    wchar_t * Text = new wchar_t[Length + 1]; 
    GetWindowText(GetDlgItem(Box, THN), Text, (Length + 1)); 
    return wstring(Text); 
}; 
+0

строка GetText (HWND Box) { int Length = GetWindowTextLength (GetDlgItem (Box, InputBar)); wchar_t * Текст = новый wchar_t [Длина + 1]; return GetWindowText (GetDlgItem (Box, InputBar), текст, (длина + 1)); }; Почему это не работает? –

+0

Что вы имеете в виду, это не работает? И что такое 'Box' и' InputBar'? – DimChtz

+0

Коробка - это TextBox, чтобы получить текст (вам нужен код из этого?), А InputBar - это номер (HMENU), который я использовал для обнаружения при нажатии. –

1
string GetText(HWND Box, int THN) 
{ 
    int Length = GetWindowTextLength(GetDlgItem(Box, THN)); 
    wchar_t * Text = new wchar_t[Length + 1]; 
    return GetWindowText(GetDlgItem(Box, THN), Text, (Length + 1)); 
}; 

Есть несколько ошибок в коде выше:

  • первый, смешивание ANSI/Unicode

  • 2-й, утечка памяти из-за new char_t[].

  • 3rd, возвращение int, когда std::string ожидается.

Давайте начнем с чего-то простого:

wchar_t Text[300] = {0}; 
GetWindowTextW(GetDlgItem(Box, THN), Text, 300); 
MessageBoxW(0, Text, 0, 0); 

Это всегда должно работать, так как длина длинный текст меньше, чем 300 (в противном случае это рубленый) Это достаточно хорошо, чтобы получить имена кнопок, или получить текст из небольшого поля редактирования.

W В конце функций действует Unicode. Или вы можете добавить #define UNICODE поверх файла cpp.

#define UNICODE 
#include <Windows.h> 

... 
int len = GetWindowTextLen(GetDlgItem(Box, THN)); 
if (len > 0) 
{ 
    //add 1 for null-terminating char 
    len += 1; 
    wchar_t Text *new wchar_t[len]; 
    GetWindowText(GetDlgItem(Box, THN), Text, len); 
    MessageBox(0, Text, 0, 0); 
    delete[]Text; 
} 

Далее, вы можете поместить это в функцию, чтобы вернуть std::wstring

std::wstring foo() 
{ 
    std::wstring::str; 
    int len = GetWindowTextLen(GetDlgItem(Box, THN)); 
    if (len > 0) 
    { 
     len += 1; 
     wchar_t Text *new wchar_t[len]; 
     GetWindowText(GetDlgItem(Box, THN), Text, len); 
     str = text; 
     delete[]Text; 
    } 
    return str; 
} 

После того, как вы получите повесить этого вы можете использовать std::wstring непосредственно:

std::wstring foo() 
{ 
    int len = 1 + GetWindowTextLength(GetDlgItem(Box, THN)); 

    //initialize a string large enough to read data 
    std::wstring str(len, L'\0'); 
    GetWindowText(GetDlgItem(Box, THN), &str[0], len); 
    return str; 
} 
Смежные вопросы