Задача такая: есть у меня программа. Она открывает диалог другой программы. На этом диалоге находятся несколько Edit'ов (в Spy++ посмотрел), и у всех одинаковые Caption'ы (тоже в Spy++ посмотрел). Мне надо с помощью моей программы вставить текст в один из Edit'ов. Я так думаю, вставлять надо с помощью EM_REPLACESEL, но для этого мне нужен дескриптор этого Edit'a. Поэтому вопрос: как мне вставить текст в Edit или хотя бы как определить его хэндл?
P.S. Нужный мне Edit стоит самым первым в диалоге, хотя это, наверно, значения не имеет.
FindWindow не даст тебе эдита.
Вместо FindWindow можно юзать EnumWindows и тд
Z>Задача такая: есть у меня программа. Она открывает диалог другой программы. На этом диалоге находятся несколько Edit'ов (в Spy++ посмотрел), и у всех одинаковые Caption'ы (тоже в Spy++ посмотрел). Мне надо с помощью моей программы вставить текст в один из Edit'ов. Я так думаю, вставлять надо с помощью EM_REPLACESEL, но для этого мне нужен дескриптор этого Edit'a. Поэтому вопрос: как мне вставить текст в Edit или хотя бы как определить его хэндл?
Z>P.S. Нужный мне Edit стоит самым первым в диалоге, хотя это, наверно, значения не имеет.
Ну почему же — очень даже имеет.
Посмотри GetTopWindow/GetNextWindow.
Это даст тебе хандл едита, а остальное ты думаешь правильно, хотя, если менять весь текст, то проще при помощи WM_SETTEXT.
Z>P.S. Нужный мне Edit стоит самым первым в диалоге, хотя это, наверно, значения не имеет.
Здравствуйте old Dutchman, Вы писали:
OD>Здравствуйте Zipper555, Вы писали:
OD>Значитца так — находишь стандартными путями форму, на которой лежит эдит — по простому можно FindWindow. OD>Шпаем посмотри Control ID. OD>Потом —
OD>
OD>FindWindow не даст тебе эдита. OD>Вместо FindWindow можно юзать EnumWindows и тд
OD>
OD> Z>>Задача такая: есть у меня программа. Она открывает диалог другой программы. На этом диалоге находятся несколько Edit'ов (в Spy++ посмотрел), и у всех одинаковые Caption'ы (тоже в Spy++ посмотрел). Мне надо с помощью моей программы вставить текст в один из Edit'ов. Я так думаю, вставлять надо с помощью EM_REPLACESEL, но для этого мне нужен дескриптор этого Edit'a. Поэтому вопрос: как мне вставить текст в Edit или хотя бы как определить его хэндл?
Z>>P.S. Нужный мне Edit стоит самым первым в диалоге, хотя это, наверно, значения не имеет.
Здравствуйте Andrew S, Вы писали:
AS>Ну почему же — очень даже имеет. AS>Посмотри GetTopWindow/GetNextWindow. AS>Это даст тебе хандл едита, а остальное ты думаешь правильно, хотя, если менять весь текст, то проще при помощи WM_SETTEXT.
Z>>P.S. Нужный мне Edit стоит самым первым в диалоге, хотя это, наверно, значения не имеет.
Не понял чем вам FindWindowEx не нравится?
Re[4]: Как вставить текст в Edit в другой программе?
Мне она всем нравится, вот только не каждый контрол находит. Например, едиты.
AS>>Ну почему же — очень даже имеет. AS>>Посмотри GetTopWindow/GetNextWindow. AS>>Это даст тебе хандл едита, а остальное ты думаешь правильно, хотя, если менять весь текст, то проще при помощи WM_SETTEXT.
Z>>>P.S. Нужный мне Edit стоит самым первым в диалоге, хотя это, наверно, значения не имеет. BM>Не понял чем вам FindWindowEx не нравится?
Здравствуйте Andrew S, Вы писали:
AS>Мне она всем нравится, вот только не каждый контрол находит. Например, едиты.
О
А как же она у меня находила?
Т.е. помню не находила если Parent невидимый был, а так всё находит нормально.....
AS>>>Ну почему же — очень даже имеет. AS>>>Посмотри GetTopWindow/GetNextWindow. AS>>>Это даст тебе хандл едита, а остальное ты думаешь правильно, хотя, если менять весь текст, то проще при помощи WM_SETTEXT.
Z>>>>P.S. Нужный мне Edit стоит самым первым в диалоге, хотя это, наверно, значения не имеет. BM>>Не понял чем вам FindWindowEx не нравится?
Re[5]: Как вставить текст в Edit в другой программе?
Здравствуйте BugMan, Вы писали:
BM>Здравствуйте Zipper555, Вы писали:
Z>>Здравствуйте BugMan,
Z>>И как тогда в моем случае мне едит найти? BM>Как и любой другой — по Caption/Text ...
С помощью какой функции?
Re[8]: Как вставить текст в Edit в другой программе?
Здравствуйте Zipper555, Вы писали:
Z>Здравствуйте BugMan, Вы писали:
BM>>Здравствуйте Zipper555, Вы писали:
Z>>>Здравствуйте BugMan,
Z>>>И как тогда в моем случае мне едит найти? BM>>Как и любой другой — по Caption/Text ...
Z>С помощью какой функции? FindWindowEx()
Re[9]: Как вставить текст в Edit в другой программе?
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 в другой программе?
ХЪ
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 в другой программе?
Не могла она у вас едит находить. Иногда лучше почитать 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 не нравится?
Здравствуйте Andrew S, Вы писали:
AS>Не могла она у вас едит находить. Иногда лучше почитать MSDN:
AS>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. AS>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>А у нас и есть поиск из другого процесса и окно (едит) заголовка не имеет. Можете попробовать — работать не будет, это обычные грабли.
Нефига не понял. А что у Edit-а Caption и Text это не одно и тоже?
Или это чисто VB-шный прикол?
Re[7]: Как вставить текст в Edit в другой программе?
Слушай, ну чего может быть проще самому сделать маленькое приложение, открыть отдельно Notepad, напечатать в нем пару символов и поискать его. Едит принадлежащий приложению ты найти сможешь, а вот "чужой" — нет.
Да, caption и edit text — разные вещи, точнее, так считает GetWindowText. Как реализовано это "там внутри" я не знаю, да и не интересно, скорее всего — просто проверяется наличие заголовка у окна по флагам.
BM>Нефига не понял. А что у Edit-а Caption и Text это не одно и тоже? BM>Или это чисто VB-шный прикол?
Здравствуйте Andrew S, Вы писали:
AS>Слушай, ну чего может быть проще самому сделать маленькое приложение,
А вот это вы зря, на RTFM я и сам посылать умею >открыть отдельно Notepad, напечатать в нем пару символов и поискать его. Едит принадлежащий приложению ты найти сможешь, а вот "чужой" — нет.
Пробовал в своем приложении, и все отлично работало. Я так понял VB-шный враппер чегото в этом деле "накручивает"
Единственно не работало когда parent невидимый был и только для Edit-а — почему так и не понял, поэтому отказался от идеи.....
AS>Да, caption и edit text — разные вещи, точнее, так считает GetWindowText. Как реализовано это "там внутри" я не знаю, да и не интересно, скорее всего — просто проверяется наличие заголовка у окна по флагам.
А я вот пробовал, и интересная вещь получается. SetWindowText() по идее ведь просто макрос на SendMessage() с WM_SETTEXT, а получается, что по GetWindowText() возвращается правильное значение, а на экране собссно ничего не меняется....
Лана.... Звиняй что на VBБ но я думаю всё достаточно наглядно....
Public Function FindWindowExEx(hWndParent As Long, strCaption As String) As Long
Dim hWndTmp As Long
Dim strCapTmp As String
Dim lngTextLen As Long
hWndTmp = FindWindowEx(hWndParent, 0, vbNullString, vbNullString)
Do While hWndTmp <> 0 And strCaption <> strCapTmp
lngTextLen = SendMessageAsLong(hWndTmp, WM_GETTEXTLENGTH, 0, 0)
strCapTmp = String$(lngTextLen, 0)
SendMessageAsString hWndTmp, WM_GETTEXT, lngTextLen + 1, strCapTmp
If strCaption = strCapTmp Then
FindWindowExEx = hWndTmp
Else
hWndTmp = FindWindowEx(hWndParent, hWndTmp, vbNullString, vbNullString) ' можно заменить на GetNexWindow()End If
Loop
End Function
Private Sub Command1_Click()
Dim hWndParent As Long
Dim hWndEdit As Long' Перед этим неплохо бы скопировать в буффер строчку "x"
hWndParent = FindWindow(vbNullString, "Добавить новую закачку")
hWndParent = FindWindowExEx(hWndParent, "Закачка")
hWndEdit = FindWindowExEx(hWndParent, "x")
SendMessageAsString hWndEdit, WM_SETTEXT, 0, "zzzzzzzzzzzz"End Sub
Можно конечно и через GetNextDlgItem(), суть в том что не надо кричать что ничего не работает.....
Re[9]: Как вставить текст в Edit в другой программе?
Самое прикольное в этом деле, что эту ф-ию можно подшаманить под DlgItem и GetWindowLong, и вообще всё чё хош, а работает она абсолютно по тому же принципу что и FindWindowEx(), только лучше
Re[5]: Как вставить текст в Edit в другой программе?
Здравствуйте old Dutchman, Вы писали:
OD>На диаложке "Добавить новую закачку". Это закладка
Хм, странно, у меня эта закладка называется "Общие", хотя все работает только если написать "Закачка" (если написать "Общие", то опять-таки дескриптор — NULL)
Кстати, у меня все работает почему-то только при пошаговой отладке, а если в нормальком режиме, то текст не вставляется в Edit...
Re[9]: Как вставить текст в Edit в другой программе?
Здравствуйте Zipper555, Вы писали:
Z>Видать, тут SendMessage не подходит, хотя я пробовал и SetDlgItemText, и PostMessage (эти две вообще даже при отладке не работают).
Вставь текст в клипборд. А потом нажимай F4 — тогда FleshGet сам вставит
Re[11]: Как вставить текст в Edit в другой программе?
Здравствуйте old Dutchman, Вы писали:
OD>Здравствуйте Zipper555, Вы писали:
Z>>Видать, тут SendMessage не подходит, хотя я пробовал и SetDlgItemText, и PostMessage (эти две вообще даже при отладке не работают).
OD>Вставь текст в клипборд. А потом нажимай F4 — тогда FleshGet сам вставит
Ну с клипбордом все понятно, вот только хотелось бы здесь обойтись без клипборда!
Re[12]: Как вставить текст в Edit в другой программе?
Здравствуйте Zipper555, Вы писали:
Z>>>Видать, тут SendMessage не подходит, хотя я пробовал и SetDlgItemText, и PostMessage (эти две вообще даже при отладке не работают).
OD>>Вставь текст в клипборд. А потом нажимай F4 — тогда FleshGet сам вставит
Z>Ну с клипбордом все понятно, вот только хотелось бы здесь обойтись без клипборда!
Покажи весь код поиска окна и вставки. У меня все работает по-любому
Re[13]: Как вставить текст в Edit в другой программе?
Задержки не нужны такие большие — можно поменьше и не везде. И везде проверяй HWND на NULL. Если NULL — или ожидание или выход.
FindWindow не видит окно, которое спрятано чз SW_HIDE. Поэтому можно попробовать с эмулировать щелчок в трэе а потом его искать.
Здравствуйте Zipper555, Вы писали:
Z>Здравствуйте old Dutchman,
Z>У меня и с задержками не работает
Так посмотри, что именно перестает работать. После каждого FindWindow сделай проверку на NULL
Z>Странно, веди если при пошаговой отладке работает, то должно и без нее работать...
Z>А какой у вас код работает? Z>
Здравствуйте old Dutchman, Вы писали:
OD>Так посмотри, что именно перестает работать. После каждого FindWindow сделай проверку на NULL
В том-то и дело, что у меня все работает, каждый дескриптор НЕ равняется NULL. Но только работает почему-то в отладке, а если просто запустить, то необходимо, чтобы этот код сработал два раза (нужно нажать на кнопку дважды).
Здравствуйте old Dutchman, Вы писали:
OD>Здравствуйте Zipper555, Вы писали:
OD>Расставь задержки небольшие. Если работает через раз — это задержки.
Z>>
А почему SendMessage (hwnd, WM_KEYDOWN, VK_F4, NULL);, а не PostMessage (hwnd, WM_KEYDOWN, VK_F4, NULL);? SendMessage тоже не работает здесь, только PostMessage.
Задержки расставлял, не помогает. Хотя ща еще раз попробую.
Re[20]: Как вставить текст в Edit в другой программе?
Здравствуйте Zipper555, Вы писали:
Z>А почему SendMessage (hwnd, WM_KEYDOWN, VK_F4, NULL);, а не PostMessage (hwnd, WM_KEYDOWN, VK_F4, NULL);? SendMessage тоже не работает здесь, только PostMessage.
Нельзя слать Post ! FleshGet, осли у него много сообщений в очереди, обработает его тогда, когда ты из своей функции выйдешь. А куда будет указатель на текст указывать ? Есть вероятность сбоя в этом случае.
Делай чз SendMessage(WM_SETTEXT) !
Да потому и не работает, что Post заносит в очередь.
А Send — другому процессуу — заносит в другую очередь, которая пуста скорее всего.
Приоритет вышы у Send. Потому сообещние обработается раньше. Поэтому нужны задержки.
Блин, я тебе говорю, как работает, шлю рабочие варианты — ты делаешь по своему и жалуешься, что ничего не пашет.
Z>Задержки расставлял, не помогает. Хотя ща еще раз попробую.