Java — GetWindowTextA, GetWindowText возвращает пустое значение в элементе управления Edit
Я пытаюсь составить список и получить содержимое элементов управления редактирования из внешнего окна в C ++ / Java, к сожалению, безуспешно.
Когда я вызываю GetWindowText или GetWindowTextA, он возвращает пустое значение в элементах управления Edit, я знаю, что есть некоторые различия между GetWindowText / GetWindowTextW и GetWindowTextA, но я не знаю, что я делаю неправильно, так как это работает на всех других элементах управления.
Решение
Я не уверен, что является причиной вашей проблемы, но для меня это сработало:
редактировать
Вы должны получить текст для редактирования другим способом, через
GetWindowTextA, GetWindowText returns empty value on Edit Control
I’m trying to list and get the content of Edit Controls from an external Window in C++ / Java, unfortunately with no success.
When I call GetWindowText or GetWindowTextA it returns an empty value on Edit Controls, I know there are some differences between GetWindowText / GetWindowTextW and GetWindowTextA but I don’t know What I’m doing wrong since it works on all other controls.
Here the C++ Code:
1 Answer 1
I’m not sure what is causing your problem, but this has worked just fine for me:
Edit
You should get the edit text a different way, via
C# как использовать WM gettext / GetWindowText API
Я хочу получить содержимое элемента управления / дескриптора приложения..
вот экспериментальный код..
есть идеи? Я прочитал какой-то метод API, такой как GetWindowText или WM_GETTEXT, но я не знаю, как его использовать или применить к моему коду.. Мне нужен учебник или пример кода.
3 ответов
GetWindowText не даст вам содержимое окон редактирования из других приложений -Он поддерживает только управляемый по умолчанию текст [как подписи меток] в процессах для предотвращения зависаний. вам нужно будет отправить WM_GETTEXT.
вам нужно будет использовать версию SendMessage StringBuilder:
Что такое код getwindowtext
char tText[254];
HWND hWnd;
//
hWnd = GetTopWindow(0);
while (hWnd != 0) <
hWnd = GetNextWindow(hWnd, GW_HWNDNEXT);
GetWindowText(hWnd, tText, 254);
.
.
>
Ошибка компилятора
e:\mydocs\visual studio 2010\projects\example1\example1\Form1.h(113): error C2664: GetWindowTextW: невозможно преобразовать параметр 2 из «char [254]» в «LPWSTR»
Где ошибка? Ткните носом, пожалуйста!
Microsoft Visual C++ 2010 Express
От: | uzhas |
Дата: | 23.07.11 16:47 |
Оценка: |
От: | mrHill |
Дата: | 23.07.11 17:31 |
Оценка: |
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, mrHill, Вы писали:
H>>Ошибка компилятора
H>>e:\mydocs\visual studio 2010\projects\example1\example1\Form1.h(113): error C2664: GetWindowTextW: невозможно преобразовать параметр 2 из «char [254]» в «LPWSTR»
H>>Где ошибка? Ткните носом, пожалуйста!
U>вы пытаетесь передать ANSI string, а просят юникодную строчку (wchar_t*)
U>либо сделайте свой текст юникодным (вместо char надо wchar_t), либо уберите поддержку уникода в проекте (в свойствах проекта уберите юникод). в последнем случае это приведет к тому, что GetWindowsText будет превращаться не в GetWindowTextW, а в GetWindowsTextA
LPWSTR tText;
HWND hWnd;
//
tText = new WCHAR[254];
hWnd = GetTopWindow(0);
while (hWnd != 0) <
hWnd = GetNextWindow(hWnd, GW_HWNDNEXT);
GetWindowText(hWnd, tText, 254);
.
.
>
Все равно не работает!
Example1.obj : error LNK2028: ссылка на неразрешенную лексему (0A000011) «extern «C» int __stdcall GetWindowTextW(struct HWND__ *,wchar_t *,int)» (?GetWindowTextW@@$$J212YGHPAUHWND__@@PA_WH@Z) в функции «private: void __clrcall Example1::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)» (?button1_Click@Form1@Example1@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)
От: | mrHill |
Дата: | 23.07.11 19:55 |
Оценка: |
От: | incomoto |
Дата: | 23.07.11 20:56 |
Оценка: |
Здравствуйте, mrHill, Вы писали:
H>Есть такой код:
H>char tText[254];
H>HWND hWnd;
H>//
H>hWnd = GetTopWindow(0);
H>while (hWnd != 0) <
H> hWnd = GetNextWindow(hWnd, GW_HWNDNEXT);
H> GetWindowText(hWnd, tText, 254);
H> .
H> .
H>>
H>Ошибка компилятора
H>e:\mydocs\visual studio 2010\projects\example1\example1\Form1.h(113): error C2664: GetWindowTextW: невозможно преобразовать параметр 2 из «char [254]» в «LPWSTR»
H>Где ошибка? Ткните носом, пожалуйста!
H>Microsoft Visual C++ 2010 Express
Ошибка преобразования типов при вызове GetWindowText (). Согласно MSDN прототип функции выглядит следующим образом:
int WINAPI GetWindowText(
__in HWND hWnd,
__out LPTSTR lpString,
__in int nMaxCount
);
где lpString — заполняемый буфер, имеющий тип LPTSTR при условии, что:
#ifdef UNICODE
typedef LPWSTR LPTSTR;
#else
typedef LPSTR LPTSTR;
#endif
определенный как (судя по сообщению MSVC++ макрос UNICODE все-таки определен):
typedef WCHAR *LPWSTR;
где WCHAR, в свою очередь определен как:
typedef wchar_t WCHAR;
где wchar_t — обыкновенный unsigned char (т.е. 16-рязрядное целое без знака), итого имеем:
typedef unsigned char *LPTSTR;
Что, в свою очередь, совсем не char [254]. Поэтому компилятор вполне добросовестно делает свою работу. Вот такой вот пирог от Micro$oft. Раз уж функция требует зловещий LPWSTR, значит этого типа переменную и нужно ей преподнести в данном случае.
От: | uzhas |
Дата: | 23.07.11 22:25 |
Оценка: |
I>где WCHAR, в свою очередь определен как:
I>typedef wchar_t WCHAR;
I>где wchar_t — обыкновенный unsigned char (т.е. 16-рязрядное целое без знака), итого имеем:
I>typedef unsigned char *LPTSTR;
Остапа понесло и принесло не туда
От: | incomoto |
Дата: | 25.07.11 07:48 |
Оценка: |
Здравствуйте, uzhas, Вы писали:
I>>где WCHAR, в свою очередь определен как:
I>>typedef wchar_t WCHAR;
I>>где wchar_t — обыкновенный unsigned char (т.е. 16-рязрядное целое без знака), итого имеем:
I>>typedef unsigned char *LPTSTR;
U>Остапа понесло и принесло не туда
Ёшкин кот, точно.
unsigned short, конечно же, никакой не unsigned char. Пардон
От: | Centaur |
Дата: | 25.07.11 08:41 |
Оценка: |
Здравствуйте, incomoto, Вы писали:
I>>>где wchar_t — обыкновенный unsigned char (т.е. 16-рязрядное целое без знака), итого имеем:
I>unsigned short, конечно же, никакой не unsigned char. Пардон
Опять неправильно. wchar_t — встроенный тип C++, никак не связанный с unsigned short.
От: | DarkEld3r |
Дата: | 25.07.11 09:12 |
Оценка: |
Здравствуйте, Centaur, Вы писали:
C>Опять неправильно. wchar_t — встроенный тип C++, никак не связанный с unsigned short.
Ну а если /Zc:wchar_t-?
От: | incomoto |
Дата: | 25.07.11 10:57 |
Оценка: |
Здравствуйте, Centaur, Вы писали:
C>Здравствуйте, incomoto, Вы писали:
I>>>>где wchar_t — обыкновенный unsigned char (т.е. 16-рязрядное целое без знака), итого имеем:
I>>unsigned short, конечно же, никакой не unsigned char. Пардон
C>Опять неправильно. wchar_t — встроенный тип C++, никак не связанный с unsigned short.
Каюсь, опять погорячился. В MSDN, правда, написано:
«By default wchar_t is a typedef for unsigned short.»
Ну а в стандарте С++98 — «implementation-defined». Правда, тип, оказывается, был внесен еще в C90, т.е. еще до официального анонсирования C++.
Что такое код getwindowtext
GetWindowText позволяет извлекать текст из статических системных сообщений с помощью перетаскивания Разработчик Nenad Hrg
GetWindowText — это очень маленькая и портативная программа, с помощью которой вы можете читать текст окна. Нажав левую кнопку мыши на кнопке со значком GetWindowText и удерживая левую кнопку мыши (перетащить), можно начать чтение. Затем просто наведите курсор мыши на окно, из которого текст должен быть прочитан.
Можно прочитать почти все тексты, например, из Edit, Static, Groupbox — Controls и т. д.
Эта программа также поддерживает деревья каталогов (SysTreeView32), комбинированный список и представления списков (SysListView32) для чтения всего содержимого. Когда вы отпустите кнопку мыши, чтение будет закончено.
GetWindowTextA, GetWindowText возвращает пустое значение на Edit Control
Я пытаюсь перечислить и получить содержимое Edit Controls от внешнего окна в C ++ / Java, к сожалению, не имели успеха.
Когда я называю GetWindowText или GetWindowTextA возвращает пустое значение на Edit Controls, я знаю, что есть некоторые различия между GetWindowText / GetWindowTextW и GetWindowTextA, но я не знаю, что я делаю неправильно, так как он работает на все другие элементы управления.
Я не уверен, что является причиной вашей проблемы, но это работает очень хорошо для меня:
Редактирование
Вы должны получить редактировать текст другой способ, с помощью
SetWindowText
Функция SetWindowText изменяет текст заголовка (если заголовок существует) указанного окна. Если указанное окно является элементом управления, то изменяется текст этого элемента управления.
BOOL SetWindowText (
HWND hWnd , // дескриптор окна или элемента управления
LPCTSTR lpString // адрес строки
Параметры
hWnd — идентифицирует окно или элемент управления, чей текст изменяется.
lpString — указывает на завершающуюся нулем строку, используемую в качестве нового заголовка окна или текста элемента управления.
Возвращаемые значения
В случае успеха возвращается ненулевое значение.
В случае неудачи возвращается нуль. Для получения дополнительной информации об ошибке, вызовите функцию GetLastError
Комментарии
Функция SetWindowText отправляет сообщение WM_SETTEXT указанному окну или элементу управления. Тем не менее, если окно является окном списка, созданным с параметром WS_CAPTION, SetWindowText устанавливает текст для элемента управления, а не для элементов списка.
Функция SetWindowText не разворачивает символы табуляции ( ASCII -код 0 x 09). Символы табуляции отображаются как вертикальная черта (|).
См . также
GetWindowText , WM_SETTEXT.
Что такое код getwindowtext
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда — alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.
|
Регистрация
Здесь нужно купить рекламу за 25 тыс руб в месяц! ) пишите сюда — alarforum@yandex.ru
|