Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > перенос данных из однойпроги в другую


Автор: shuttle 19.5.2009, 05:49
Есть две проги из себя в основном представляют несколько диалоговых окон. Как из диалогово окно одной проги перенести данные в диалоговое окно другой проги. 
т.е. надо из текстовых полей диалогового окна одно пролги перенести данные в текстовые поля другой проги. Исходников разумеется нет. 
Какой функцией можо получить доступ к данным диалогового окна (текстовым полям, check box-ам, radio button-ам)?

Автор: Andrey44 19.5.2009, 06:55
Цитата(shuttle @  19.5.2009,  05:49 Найти цитируемый пост)
надо из текстовых полей диалогового окна одно пролги перенести данные в текстовые поля другой проги

FindWindow()->GetWindowText()->FindWindow()->SetWindowText()

Цитата(shuttle @  19.5.2009,  05:49 Найти цитируемый пост)
Какой функцией можо получить доступ к данным диалогового окна (текстовым полям, check box-ам, radio button-ам)? 

FindWindow()

Автор: azesmcar 19.5.2009, 08:35
Цитата(Andrey44 @  19.5.2009,  06:55 Найти цитируемый пост)
FindWindow() 

Цитата

FindWindow
This function retrieves the handle to the top-level window whose class name and window name match the specified strings. This function does not search child windows. 

FindWindowEx

Автор: Andrey44 19.5.2009, 08:37
azesmcar, ну-у-у можно еще использовать EnumChildWindows() smile 

Автор: azesmcar 19.5.2009, 08:40
Цитата(Andrey44 @  19.5.2009,  08:37 Найти цитируемый пост)
azesmcar, ну-у-у можно еще использовать EnumChildWindows() 

Вообще-то эти две функции разные задачи решают. Одна для поиска, другая для итерации. Смотря что нужно smile 

Автор: Andrey44 19.5.2009, 08:47
Цитата(azesmcar @  19.5.2009,  08:40 Найти цитируемый пост)
Вообще-то эти две функции разные задачи решают. Одна для поиска, другая для итерации. Смотря что нужно

Через FindWindow() находим главное окно, а потом через EnumChildWindows() перебираем все дочерние. smile 

Автор: shuttle 20.5.2009, 05:46
FindWindow() только HWND возвращает, а GetWindowText только заголовок. А как остальные данные получить?

Автор: Andrey44 20.5.2009, 07:58
Цитата(shuttle @  20.5.2009,  05:46 Найти цитируемый пост)
FindWindow() только HWND возвращает, а GetWindowText только заголовок. А как остальные данные получить? 

Ну не хочется через GetWindowText тогда посылай эдиту сообщение WM_GETTEXT и получай текст
Не хочется через SetWindowText тогда посылай эдиту сообщение WM_SETTEXT и устанавливай новый текст

Автор: shuttle 21.5.2009, 08:09
Смотрел через spy++, когда GetWindowText считывает из кнопки значение, то получаю название кнопки, когда с textbox-а, получаю только пустую строку, хотя строка там есть и spy++ ее показывает.

Автор: Andrey44 21.5.2009, 08:36
Цитата(shuttle @  21.5.2009,  08:09 Найти цитируемый пост)
то получаю название кнопки

Какое название?

Цитата(shuttle @  21.5.2009,  08:09 Найти цитируемый пост)
textbox-а, получаю только пустую строку, хотя строка там есть и spy++ ее показывает. 

А HANDLE ты правильные получаешь?

Автор: artsb 21.5.2009, 09:27
shuttle, вот пример. Вытягивает текст из окна Edit калькулятора и записывает туда свой текст:
Код

HWND Window, Edit;
char Buf[256];
Window = FindWindowEx(NULL, NULL, "SciCalc", NULL);
if(!Window){
  ShowMessage("Калькулятор не запущен!");
  return;
}
Edit = FindWindowEx(Window, NULL, "Edit", NULL);
if(!Edit){
  ShowMessage("Не удалось найти Edit!");
  return;
}
SendMessage(Edit, WM_GETTEXT, 255, (LPARAM)Buf);
Label1->Caption = Buf;
SendMessage(Edit, WM_SETTEXT, 0, (LPARAM)"Я балуюсь :)");


Добавлено через 3 минуты и 51 секунду
Цитата(Andrey44 @  21.5.2009,  08:36 Найти цитируемый пост)
А HANDLE ты правильные получаешь? 

Такой косяк бывает. Не у всех эдитов можно получить текст с помощью GetWindowText. Да у того же калькулятора из примера выше. Сто процентный вариант - это отправить сообщение. Имхо

Автор: shuttle 21.5.2009, 09:51
получаю текст в edit-e посылкой сообщения WM_GETTEXT. А как теперь получить имя(name) edit-а. 

Автор: artsb 21.5.2009, 11:12
Цитата(shuttle @  21.5.2009,  09:51 Найти цитируемый пост)
как теперь получить имя(name) edit-а. 

Мне кажется, что никак. Хотя на 100% не уверен.
Да и зачем оно нужно?...

Автор: Earnest 21.5.2009, 11:17
А что, собственно, такое "имя эдита"? Нет у него никакого имени, строкового, по крайней мере.

Автор: shuttle 21.5.2009, 11:26
имя edit-а в MFC это типа IDC_EDIT1, IDC_EDIT2, ... . Текстовых полей очень много, хотелось бы знать, с какого конкретно поля считываю значение.

Автор: Andrey44 21.5.2009, 12:38
Цитата(shuttle @  21.5.2009,  11:26 Найти цитируемый пост)
имя edit-а в MFC это типа IDC_EDIT1, IDC_EDIT2

Ты никак не сможешь получить. Это идентификатор ресурса.Так что я думаю что никак.

Автор: artsb 21.5.2009, 13:32
shuttle может тебе как-то помогут следующие функции:
EnumChildWindows()
GetWindowRect()
GetClientRect()
GetClassName()

Т.е. мне кажется, что единственный способ - это сравнивать позиции Edit'ов...

Автор: mekhanikus 21.5.2009, 15:42
Может функция GetDlgCtrlID поможет?

Цитата

The GetDlgCtrlID function returns the identifier of the specified control.

Автор: bugmenot 21.5.2009, 16:31
shuttle, воспользуйся программой Window Handle Picker чтоб узнать ID своего EDIT-а:
http://www.codeguru.com/cpp/misc/samples/article.php/c1489

Потом вызывай:
Код

hWnd = FindWindow("Class", "Caption");

SendDlgItemMessage(hWnd, nIDDlgItem /* ID своего EDIT-а */, WM_SETTEXT, NULL, (LPARAM)"Hi mom!");


Удачи smile

Автор: shuttle 27.5.2009, 12:48
С одним диалоговым окном разобрался. Второе - это текстовые поля на интернет странице, ID этих текстовых полней не показывает spy++ из VS и Window Handle Picker. Каким способом можно получить достум к таким текстовым полям.

Автор: xvr 27.5.2009, 14:50
Цитата(shuttle @ 27.5.2009,  12:48)
С одним диалоговым окном разобрался. Второе - это текстовые поля на интернет странице, ID этих текстовых полней не показывает spy++ из VS и Window Handle Picker. 

Видимо это не окна
Цитата

Каким способом можно получить достум к таким текстовым полям.
Через OLE к IE (если страница показывается в IE). Поищи http://forum.vingrad.ru/forum/c-c++COM-DCOM-AvtiveX-ATL-COBRA.html, этот вопрос уже поднимался

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)