Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не получается взять из "Калькулятор Плюс"

30K
05 марта 2009 года
asmel
50 / / 05.03.2009
Это мои первые шаги в C++ Builder, прошу особенно сильно не мочить. В чем проблема: хочу взять текст из окна вывода общеизвестного Winдовского калькулятора "Калькулятор Плюс" ничего не получается. В чем проблема?! Текст фрагмента:
 
Код:
HWND hWindow; // окно "Калькулятор Плюс"
HWND hEdit;   // окно ввода в "Калькулятор Плюс"
hWindow = FindWindow(NULL, "Калькулятор Плюс");
hEdit = FindWindowEx( hWindow, NULL, "Edit", NULL);
dl_mess = GetWindowTextLength(hEdit);
GetWindowText(hEdit, my_buff, 255);
92
06 марта 2009 года
Тень Пса
2.2K / / 19.10.2006
извини канеш... а ты поиск окошка сделал? =) ты уверен, что ты именно его нашёл? =)
30K
06 марта 2009 года
asmel
50 / / 05.03.2009
Что нашел, уверен. Видно при трассировке. В самодельных программках все OK, а из "Калькулятор Плюс" текст из окна взять не могу!
255
06 марта 2009 года
Dart Bobr
1.4K / / 09.04.2004
А GetLastError что говорит?
397
06 марта 2009 года
SergPas
527 / / 03.02.2007
Вот что в MSDN написано по поводу использования функции GetWindowText():
Цитата:
This function cannot retrieve the text of an edit control in another application.


Вот поэтому Вы и не получаете строку из edit'a калькулятора. Поэтому лучше воспользоваться посылкой сообщения WM_GETTEXT, обработка которого гарантирует успешный результат. Единственным ограничением использования этого сообщения является тот случай, когда Вы пытается запросить текст окна у зависшего приложения, что приводит (не всегда) к зависанию и Вашего приложения. В этом плане надежнее использовать функцию GetWindowText(). Обойти это ограничение позволяет отправка сообщения WM_GETTEXT посредством функции SendMessageTimeout().

30K
06 марта 2009 года
asmel
50 / / 05.03.2009
SergPas
сделал исправления, не помогает
 
Код:
char addr[50];
SendMessage(hEdit, WM_GETTEXT, 0, (int)addr);
255
06 марта 2009 года
Dart Bobr
1.4K / / 09.04.2004
Любопытное исправление.
Подумайте логично, что такое (int)addr, и куда будет записан запрашиваемый текст, и попробуйте самостоятельно сделать исправление :)
397
06 марта 2009 года
SergPas
527 / / 03.02.2007
Цитата: asmel
SergPas
сделал исправления, не помогает
 
Код:
char addr[50];
SendMessage(hEdit, WM_GETTEXT, 0, (int)addr);


MSDN хоть иногда читайте...
wParam - определяет максимальное число копируемых символов, включая терминальный нуль (размер буфера);
lParam - указатель на буфер с текстом.

397
06 марта 2009 года
SergPas
527 / / 03.02.2007
Цитата: Dart Bobr
Любопытное исправление.
Подумайте логично, что такое (int)addr, и куда будет записан запрашиваемый текст, и попробуйте самостоятельно сделать исправление :)


Хе, опередил... ;)

30K
06 марта 2009 года
asmel
50 / / 05.03.2009
Parameters
Все, что мне выдает MSDN
hWnd
[in] Handle to the window whose window procedure will receive the message. If this parameter is HWND_BROADCAST, the message is sent to all top-level windows in the system, including disabled or invisible unowned windows, overlapped windows, and pop-up windows; but the message is not sent to child windows.
Msg
[in] Specifies the message to be sent.
wParam
[in] Specifies additional message-specific information.
lParam
[in] Specifies additional message-specific information.
Return Value

И потом, я просил сильно меня не мочить, я еще только учусь.
397
06 марта 2009 года
SergPas
527 / / 03.02.2007
Вы смотрите раздел справки по функции SendMessage, а надо по сообщению WM_GETTEXT.
30K
06 марта 2009 года
asmel
50 / / 05.03.2009
Ну так, что писать!?
последний вариант
SendMessage(hEdit, WM_GETTEXT, 100, *addr);
приводит к ошибке
397
06 марта 2009 года
SergPas
527 / / 03.02.2007
 
Код:
SendMessage(hEdit, WM_GETTEXT, (WPARAM)sizeof(addr), (LPARAM)addr);
30K
07 марта 2009 года
asmel
50 / / 05.03.2009
Спасибо SergPas, не знаю почему, но
 
Код:
char mel[50] = "0";

hWindow = FindWindow(NULL, "Калькулятор Плюс");
hEdit = FindWindowEx( hWindow, NULL, "Edit", NULL);

SendMessage(hEdit, WM_GETTEXT, 10, (int)mel);

код, который все сделал так, как я хотел, как говорится практика критерий истины. Еще раз спасибо!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог