Как вставить текст в Edit в другой программе?
От: Zipper555  
Дата: 05.11.02 14:58
Оценка:
Задача такая: есть у меня программа. Она открывает диалог другой программы. На этом диалоге находятся несколько Edit'ов (в Spy++ посмотрел), и у всех одинаковые Caption'ы (тоже в Spy++ посмотрел). Мне надо с помощью моей программы вставить текст в один из Edit'ов. Я так думаю, вставлять надо с помощью EM_REPLACESEL, но для этого мне нужен дескриптор этого Edit'a. Поэтому вопрос: как мне вставить текст в Edit или хотя бы как определить его хэндл?

P.S. Нужный мне Edit стоит самым первым в диалоге, хотя это, наверно, значения не имеет.
Re: Как вставить текст в Edit в другой программе?
От: old Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 05.11.02 15:14
Оценка:
Здравствуйте Zipper555, Вы писали:

Значитца так — находишь стандартными путями форму, на которой лежит эдит — по простому можно FindWindow.
Шпаем посмотри Control ID.
Потом —

HWND hWndForm = FindWindow(szClassNameFromSpy,szWindowNameFromSpy);
if(hWndForm == NULL)
   return FALSE;

HWND hWndEdit = GetDlgItem(hWndForm,dwCtlIDFromSPY);


или

HWND hWndEdit = SetDlgItemText(hWndForm,dwCtlID,_T("Some text"));


FindWindow не даст тебе эдита.
Вместо FindWindow можно юзать EnumWindows и тд




Z>Задача такая: есть у меня программа. Она открывает диалог другой программы. На этом диалоге находятся несколько Edit'ов (в Spy++ посмотрел), и у всех одинаковые Caption'ы (тоже в Spy++ посмотрел). Мне надо с помощью моей программы вставить текст в один из Edit'ов. Я так думаю, вставлять надо с помощью EM_REPLACESEL, но для этого мне нужен дескриптор этого Edit'a. Поэтому вопрос: как мне вставить текст в Edit или хотя бы как определить его хэндл?


Z>P.S. Нужный мне Edit стоит самым первым в диалоге, хотя это, наверно, значения не имеет.
Re: Как вставить текст в Edit в другой программе?
От: Andrew S Россия http://alchemy-lab.com
Дата: 05.11.02 16:21
Оценка:
Ну почему же — очень даже имеет.
Посмотри GetTopWindow/GetNextWindow.
Это даст тебе хандл едита, а остальное ты думаешь правильно, хотя, если менять весь текст, то проще при помощи WM_SETTEXT.

Z>P.S. Нужный мне Edit стоит самым первым в диалоге, хотя это, наверно, значения не имеет.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[2]: Как вставить текст в Edit в другой программе?
От: Zipper555  
Дата: 05.11.02 16:23
Оценка:
Здравствуйте old Dutchman, Вы писали:

OD>Здравствуйте Zipper555, Вы писали:


OD>Значитца так — находишь стандартными путями форму, на которой лежит эдит — по простому можно FindWindow.

OD>Шпаем посмотри Control ID.
OD>Потом —

OD>
OD>HWND hWndForm = FindWindow(szClassNameFromSpy,szWindowNameFromSpy);
OD>if(hWndForm == NULL)
OD>   return FALSE;

OD>HWND hWndEdit = GetDlgItem(hWndForm,dwCtlIDFromSPY);
OD>


OD>или


OD>
OD>HWND hWndEdit = SetDlgItemText(hWndForm,dwCtlID,_T("Some text"));
OD>


OD>FindWindow не даст тебе эдита.

OD>Вместо FindWindow можно юзать EnumWindows и тд

OD>


OD>

Z>>Задача такая: есть у меня программа. Она открывает диалог другой программы. На этом диалоге находятся несколько Edit'ов (в Spy++ посмотрел), и у всех одинаковые Caption'ы (тоже в Spy++ посмотрел). Мне надо с помощью моей программы вставить текст в один из Edit'ов. Я так думаю, вставлять надо с помощью EM_REPLACESEL, но для этого мне нужен дескриптор этого Edit'a. Поэтому вопрос: как мне вставить текст в Edit или хотя бы как определить его хэндл?

Z>>P.S. Нужный мне Edit стоит самым первым в диалоге, хотя это, наверно, значения не имеет.


Спасибо, только что-то не работает:

HWND hwnd = FindWindow (NULL, "Default - FlashGet");
PostMessage (hwnd, WM_KEYDOWN, VK_F4, NULL);
hwnd = FindWindow (NULL, "Добавить новую закачку");
HWND hWndEdit = GetDlgItem(hwnd, 0x000003E9);
SendMessage (hWndEdit, EM_REPLACESEL, TRUE, (LPARAM)"Text");
PostMessage (hwnd, WM_KEYDOWN, VK_RETURN, NULL);


hWndEdit почему-то получает NULL.
Re[3]: Как вставить текст в Edit в другой программе?
От: old Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 05.11.02 16:27
Оценка:
Здравствуйте Zipper555, Вы писали:


Z>
Z>HWND hwnd = FindWindow (NULL, "Default - FlashGet");
Z>PostMessage (hwnd, WM_KEYDOWN, VK_F4, NULL);
Z>hwnd = FindWindow (NULL, "Добавить новую закачку");
Z>HWND hWndEdit = GetDlgItem(hwnd, 0x000003E9);
Z>SendMessage (hWndEdit, EM_REPLACESEL, TRUE, (LPARAM)"Text");
Z>PostMessage (hwnd, WM_KEYDOWN, VK_RETURN, NULL);
Z>


Z>hWndEdit почему-то получает NULL.


Потому, что этот контрол лежит не на диаложке, а на пейдже. Его тоже поймать надо

Имя окна "Закачка" а класс "#32770" — это даже без шпая видно.
Re[2]: Как вставить текст в Edit в другой программе?
От: BugMan  
Дата: 05.11.02 16:50
Оценка:
Здравствуйте Andrew S, Вы писали:

AS>Ну почему же — очень даже имеет.

AS>Посмотри GetTopWindow/GetNextWindow.
AS>Это даст тебе хандл едита, а остальное ты думаешь правильно, хотя, если менять весь текст, то проще при помощи WM_SETTEXT.

Z>>P.S. Нужный мне Edit стоит самым первым в диалоге, хотя это, наверно, значения не имеет.

Не понял чем вам FindWindowEx не нравится?
Re[4]: Как вставить текст в Edit в другой программе?
От: Zipper555  
Дата: 05.11.02 16:54
Оценка:
Здравствуйте old Dutchman,

И что делать?

//не работает
HWND hwnd = FindWindow (NULL, "Default - FlashGet");
PostMessage (hwnd, WM_KEYDOWN, VK_F4, NULL);
hwnd = FindWindow (NULL, "Добавить новую закачку");
hwnd = GetDlgItem (hwnd, 0x00003020);
HWND hWndEdit = GetDlgItem(hwnd, 0x000003E9);
SendMessage (hWndEdit, EM_REPLACESEL, TRUE, (LPARAM)"asdf");
PostMessage (hwnd, WM_KEYDOWN, VK_RETURN, NULL);
Re[3]: Как вставить текст в Edit в другой программе?
От: Andrew S Россия http://alchemy-lab.com
Дата: 05.11.02 17:01
Оценка:
Мне она всем нравится, вот только не каждый контрол находит. Например, едиты.

AS>>Ну почему же — очень даже имеет.

AS>>Посмотри GetTopWindow/GetNextWindow.
AS>>Это даст тебе хандл едита, а остальное ты думаешь правильно, хотя, если менять весь текст, то проще при помощи WM_SETTEXT.

Z>>>P.S. Нужный мне Edit стоит самым первым в диалоге, хотя это, наверно, значения не имеет.

BM>Не понял чем вам FindWindowEx не нравится?
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[4]: Как вставить текст в Edit в другой программе?
От: Zipper555  
Дата: 05.11.02 17:17
Оценка:
Здравствуйте Andrew S, Вы писали:

Че то не получается у меня через GetTopWindow/GetNextWindow. Как ими едит получить?
Re[4]: Как вставить текст в Edit в другой программе?
От: BugMan  
Дата: 05.11.02 17:29
Оценка:
Здравствуйте Andrew S, Вы писали:

AS>Мне она всем нравится, вот только не каждый контрол находит. Например, едиты.

О
А как же она у меня находила?
Т.е. помню не находила если Parent невидимый был, а так всё находит нормально.....

AS>>>Ну почему же — очень даже имеет.

AS>>>Посмотри GetTopWindow/GetNextWindow.
AS>>>Это даст тебе хандл едита, а остальное ты думаешь правильно, хотя, если менять весь текст, то проще при помощи WM_SETTEXT.

Z>>>>P.S. Нужный мне Edit стоит самым первым в диалоге, хотя это, наверно, значения не имеет.

BM>>Не понял чем вам FindWindowEx не нравится?
Re[5]: Как вставить текст в Edit в другой программе?
От: Zipper555  
Дата: 05.11.02 17:38
Оценка:
Здравствуйте BugMan,

И как тогда в моем случае мне едит найти?
Re[6]: Как вставить текст в Edit в другой программе?
От: BugMan  
Дата: 05.11.02 18:03
Оценка:
Здравствуйте Zipper555, Вы писали:

Z>Здравствуйте BugMan,


Z>И как тогда в моем случае мне едит найти?

Как и любой другой — по Caption/Text ...
Re[7]: Как вставить текст в Edit в другой программе?
От: Zipper555  
Дата: 05.11.02 18:04
Оценка:
Здравствуйте BugMan, Вы писали:

BM>Здравствуйте Zipper555, Вы писали:


Z>>Здравствуйте BugMan,


Z>>И как тогда в моем случае мне едит найти?

BM>Как и любой другой — по Caption/Text ...

С помощью какой функции?
Re[8]: Как вставить текст в Edit в другой программе?
От: BugMan  
Дата: 05.11.02 18:13
Оценка:
Здравствуйте Zipper555, Вы писали:

Z>Здравствуйте BugMan, Вы писали:


BM>>Здравствуйте Zipper555, Вы писали:


Z>>>Здравствуйте BugMan,


Z>>>И как тогда в моем случае мне едит найти?

BM>>Как и любой другой — по Caption/Text ...

Z>С помощью какой функции?

FindWindowEx()
Re[9]: Как вставить текст в Edit в другой программе?
От: Zipper555  
Дата: 05.11.02 18:20
Оценка:
Здравствуйте BugMan,

И как здесь написать?
HWND hwnd = FindWindow (NULL, "Default - FlashGet");
PostMessage (hwnd, WM_KEYDOWN, VK_F4, NULL);
hwnd = FindWindow (NULL, "Äîáàâèòü íîâóþ çàêà÷êó");
hwnd = GetDlgItem (hwnd, 00003020);
HWND hWndEdit = GetDlgItem(hwnd, 000003E9);
SendMessage (hWndEdit, EM_REPLACESEL, TRUE, (LPARAM)"asdf");
PostMessage (hwnd, WM_KEYDOWN, VK_RETURN, NULL);
Re: Как вставить текст в Edit в другой программе?
От: Zipper555  
Дата: 05.11.02 18:52
Оценка:
Подскажите кто-нить, плиииииз, очень надо!
Re[10]: Как вставить текст в Edit в другой программе?
От: BugMan  
Дата: 05.11.02 18:55
Оценка:
Здравствуйте Zipper555, Вы писали:

Z>Здравствуйте BugMan,


Z>И как здесь написать?

Z>
Z>HWND hwnd = FindWindow (NULL, "Default - FlashGet");
Z>PostMessage (hwnd, WM_KEYDOWN, VK_F4, NULL);
Z>hwnd = FindWindow (NULL, "Äîáàâèòü íîâóþ çàêà÷êó");
Z>hwnd = GetDlgItem (hwnd, 00003020);
Z>HWND hWndEdit = GetDlgItem(hwnd, 000003E9);
Z>SendMessage (hWndEdit, EM_REPLACESEL, TRUE, (LPARAM)"asdf");
Z>PostMessage (hwnd, WM_KEYDOWN, VK_RETURN, NULL);
Z>


Не понял чем у тебя тут нажатия кнопок занимаются, ну да неважно....

HWND hWnd = FindWindow (NULL, "Default - FlashGet"); // parent
HWND hWndEdit = FindWindowEx(hWnd, NULL, "whatever class name", "text in da textbox"); // find window located on hWnd

Вобщем по такому принципу построишь.....
Re[11]: Как вставить текст в Edit в другой программе?
От: Zipper555  
Дата: 05.11.02 19:10
Оценка:
Здравствуйте BugMan, Вы писали:

BM>Здравствуйте Zipper555, Вы писали:


Z>>Здравствуйте BugMan,


Z>>И как здесь написать?

Z>>
Z>>HWND hwnd = FindWindow (NULL, "Default - FlashGet");
Z>>PostMessage (hwnd, WM_KEYDOWN, VK_F4, NULL);
Z>>hwnd = FindWindow (NULL, "Äîáàâèòü íîâóþ çàêà÷êó");
Z>>hwnd = GetDlgItem (hwnd, 00003020);
Z>>HWND hWndEdit = GetDlgItem(hwnd, 000003E9);
Z>>SendMessage (hWndEdit, EM_REPLACESEL, TRUE, (LPARAM)"asdf");
Z>>PostMessage (hwnd, WM_KEYDOWN, VK_RETURN, NULL);
Z>>


BM>Не понял чем у тебя тут нажатия кнопок занимаются, ну да неважно....


BM>
BM>HWND hWnd = FindWindow (NULL, "Default - FlashGet"); // parent
BM>HWND hWndEdit = FindWindowEx(hWnd, NULL, "whatever class name", "text in da textbox"); // find window located on hWnd
BM>

BM>Вобщем по такому принципу построишь.....

Так не покатит, у меня Edit в диалоге на вкладке....

//опрделение дескриптора parent'a
HWND hwnd = FindWindow (NULL, "Default - FlashGet");
//посылаем ему сообщение, чтоб по F4 открыл один из своих диалогов, у которого Caption = "Добавить новую закачку"
PostMessage (hwnd, WM_KEYDOWN, VK_F4, NULL);
hwnd = FindWindow (NULL, "Добавить новую закачку");
//а дальше на вкладке "Общие" в этом диалоге надо вставить текст в Edit (причем Edit'ов много, а мне нужен только один)
//вот здесь я и не знаю, что делать
hwnd = GetDlgItem (hwnd, 00003020);
HWND hWndEdit = GetDlgItem(hwnd, 000003E9);
SendMessage (hWndEdit, EM_REPLACESEL, TRUE, (LPARAM)"asdf");
//здесь посылается сообщение, чтобы диалог закрылся по Enter'у
PostMessage (hwnd, WM_KEYDOWN, VK_RETURN, NULL);
Re[12]: Как вставить текст в Edit в другой программе?
От: BugMan  
Дата: 05.11.02 19:44
Оценка:
Здравствуйте Zipper555, Вы писали:

ХЪ

Z>Так не покатит, у меня Edit в диалоге на вкладке....

А разница? Твоя задача найти окно находящееся на другом окне, так?

Z>
Z>//опрделение дескриптора parent'a
Z>HWND hwnd = FindWindow (NULL, "Default - FlashGet");
Z>//посылаем ему сообщение, чтоб по F4 открыл один из своих диалогов, у которого Caption = "Добавить новую закачку"
Z>PostMessage (hwnd, WM_KEYDOWN, VK_F4, NULL);
Z>hwnd = FindWindow (NULL, "Добавить новую закачку");
Z>//а дальше на вкладке "Общие" в этом диалоге надо вставить текст в Edit (причем Edit'ов много, а мне нужен только один)
Z>//вот здесь я и не знаю, что делать
Z>hwnd = GetDlgItem (hwnd, 00003020);
Z>HWND hWndEdit = GetDlgItem(hwnd, 000003E9);
Z>SendMessage (hWndEdit, EM_REPLACESEL, TRUE, (LPARAM)"asdf");
Z>//здесь посылается сообщение, чтобы диалог закрылся по Enter'у
Z>PostMessage (hwnd, WM_KEYDOWN, VK_RETURN, NULL);
Z>


OK ну нашел ты окно "Добавить новую закачку", дальше находишь хендл табконтрола (закладки=фальшивка — это всё одно окно) Т.е. выглядит так:
Окно "Добавить новую закачку"
   |
   L TabControl
        |
        L Edit "Добавить новую закачку"

Будешь ты находить Edit по GetDlgItem или FindWindowEx паралельно , т.к. дефаулт текст для Edit ты знаешь.

Скажи хоть где именно не работет. Это
hwnd = GetDlgItem (hwnd, 00003020);

или это ?
HWND hWndEdit = GetDlgItem(hwnd, 000003E9);
Re[5]: Как вставить текст в Edit в другой программе?
От: Andrew S Россия http://alchemy-lab.com
Дата: 05.11.02 20:19
Оценка:
Не могла она у вас едит находить. Иногда лучше почитать MSDN:

1. If the lpWindowName parameter is not NULL, FindWindowEx calls the GetWindowText function to retrieve the window name for comparison. For a description of a potential problem that can arise, see the Remarks for GetWindowText.
2. If the target window is owned by another process and has a caption, GetWindowText retrieves the window caption text. If the window does not have a caption, the return value is a null string.

А у нас и есть поиск из другого процесса и окно (едит) заголовка не имеет. Можете попробовать — работать не будет, это обычные грабли.


AS>>Мне она всем нравится, вот только не каждый контрол находит. Например, едиты.

BM>О
BM>А как же она у меня находила?
BM>Т.е. помню не находила если Parent невидимый был, а так всё находит нормально.....

AS>>>>Ну почему же — очень даже имеет.

AS>>>>Посмотри GetTopWindow/GetNextWindow.
AS>>>>Это даст тебе хандл едита, а остальное ты думаешь правильно, хотя, если менять весь текст, то проще при помощи WM_SETTEXT.

Z>>>>>P.S. Нужный мне Edit стоит самым первым в диалоге, хотя это, наверно, значения не имеет.

BM>>>Не понял чем вам FindWindowEx не нравится?
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.