Re[5]: Как вставить текст в Edit в другой программе?
От: old Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 06.11.02 08:16
Оценка: 2 (1)
Здравствуйте Zipper555, Вы писали:

Вот рабочий пример:
Z>
HWND hWnd = ::FindWindow(_T("#32770"),_T("Добавить новую закачку"));
HWND hWndPage = ::FindWindowEx(hWnd,NULL,_T("#32770"),_T("Закачка"));
HWND hWndEdit = ::GetDlgItem(hWndPage,0x3E9);
Z>
Как вставить текст в 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 — стараемся писАть по-русски
Re[6]: Как вставить текст в Edit в другой программе?
От: BugMan  
Дата: 05.11.02 20:49
Оценка:
Здравствуйте 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 в другой программе?
От: Andrew S Россия http://alchemy-lab.com
Дата: 05.11.02 21:24
Оценка:
Слушай, ну чего может быть проще самому сделать маленькое приложение, открыть отдельно Notepad, напечатать в нем пару символов и поискать его. Едит принадлежащий приложению ты найти сможешь, а вот "чужой" — нет.

Да, caption и edit text — разные вещи, точнее, так считает GetWindowText. Как реализовано это "там внутри" я не знаю, да и не интересно, скорее всего — просто проверяется наличие заголовка у окна по флагам.

BM>Нефига не понял. А что у Edit-а Caption и Text это не одно и тоже?

BM>Или это чисто VB-шный прикол?
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[8]: Как вставить текст в Edit в другой программе?
От: BugMan  
Дата: 05.11.02 23:18
Оценка:
Здравствуйте 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 в другой программе?
От: BugMan  
Дата: 05.11.02 23:26
Оценка:
Самое прикольное в этом деле, что эту ф-ию можно подшаманить под DlgItem и GetWindowLong, и вообще всё чё хош, а работает она абсолютно по тому же принципу что и FindWindowEx(), только лучше
Re[6]: Как вставить текст в Edit в другой программе?
От: Zipper555  
Дата: 06.11.02 09:40
Оценка:
Здравствуйте old Dutchman, Вы писали:

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


OD>Вот рабочий пример:

Z>>
OD>HWND hWnd = ::FindWindow(_T("#32770"),_T("Добавить новую закачку"));
OD>HWND hWndPage = ::FindWindowEx(hWnd,NULL,_T("#32770"),_T("Закачка"));
OD>HWND hWndEdit = ::GetDlgItem(hWndPage,0x3E9);
Z>>


Спасибо! Все работает. Вот только где находится окно "Закачка"?
Re[6]: Как вставить текст в Edit в другой программе?
От: Zipper555  
Дата: 06.11.02 09:56
Оценка:
Здравствуйте old Dutchman, Вы писали:

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


OD>Вот рабочий пример:

Z>>
OD>HWND hWnd = ::FindWindow(_T("#32770"),_T("Добавить новую закачку"));
OD>HWND hWndPage = ::FindWindowEx(hWnd,NULL,_T("#32770"),_T("Закачка"));
OD>HWND hWndEdit = ::GetDlgItem(hWndPage,0x3E9);
Z>>


Да и еще, че такое "_T"?
Re[7]: Как вставить текст в Edit в другой программе?
От: old Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 06.11.02 09:59
Оценка:
Здравствуйте Zipper555, Вы писали:

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


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


OD>>Вот рабочий пример:

Z>>>
OD>>HWND hWnd = ::FindWindow(_T("#32770"),_T("Добавить новую закачку"));
OD>>HWND hWndPage = ::FindWindowEx(hWnd,NULL,_T("#32770"),_T("Закачка"));
OD>>HWND hWndEdit = ::GetDlgItem(hWndPage,0x3E9);
Z>>>



На диаложке "Добавить новую закачку". Это закладка

Z>Спасибо! Все работает. Вот только где находится окно "Закачка"?
Re[8]: Как вставить текст в Edit в другой программе?
От: Zipper555  
Дата: 06.11.02 10:11
Оценка:
Здравствуйте old Dutchman, Вы писали:

OD>На диаложке "Добавить новую закачку". Это закладка


Хм, странно, у меня эта закладка называется "Общие", хотя все работает только если написать "Закачка" (если написать "Общие", то опять-таки дескриптор — NULL)

Кстати, у меня все работает почему-то только при пошаговой отладке, а если в нормальком режиме, то текст не вставляется в Edit...
Re[9]: Как вставить текст в Edit в другой программе?
От: Zipper555  
Дата: 06.11.02 10:54
Оценка:
Видать, тут SendMessage не подходит, хотя я пробовал и SetDlgItemText, и PostMessage (эти две вообще даже при отладке не работают).
Re[10]: Как вставить текст в Edit в другой программе?
От: old Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 06.11.02 10:58
Оценка:
Здравствуйте Zipper555, Вы писали:

Z>Видать, тут SendMessage не подходит, хотя я пробовал и SetDlgItemText, и PostMessage (эти две вообще даже при отладке не работают).


Вставь текст в клипборд. А потом нажимай F4 — тогда FleshGet сам вставит
Re[11]: Как вставить текст в Edit в другой программе?
От: Zipper555  
Дата: 06.11.02 11:02
Оценка:
Здравствуйте old Dutchman, Вы писали:

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


Z>>Видать, тут SendMessage не подходит, хотя я пробовал и SetDlgItemText, и PostMessage (эти две вообще даже при отладке не работают).


OD>Вставь текст в клипборд. А потом нажимай F4 — тогда FleshGet сам вставит


Ну с клипбордом все понятно, вот только хотелось бы здесь обойтись без клипборда!
Re[12]: Как вставить текст в Edit в другой программе?
От: old Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 06.11.02 11:04
Оценка:
Здравствуйте Zipper555, Вы писали:

Z>>>Видать, тут SendMessage не подходит, хотя я пробовал и SetDlgItemText, и PostMessage (эти две вообще даже при отладке не работают).


OD>>Вставь текст в клипборд. А потом нажимай F4 — тогда FleshGet сам вставит


Z>Ну с клипбордом все понятно, вот только хотелось бы здесь обойтись без клипборда!


Покажи весь код поиска окна и вставки. У меня все работает по-любому
Re[13]: Как вставить текст в Edit в другой программе?
От: Zipper555  
Дата: 06.11.02 11:11
Оценка:
Здравствуйте old Dutchman,

HWND hwnd = FindWindow (NULL, "Default - FlashGet");
PostMessage (hwnd, WM_KEYDOWN, VK_F4, NULL);
HWND hWnd = FindWindow("#32770", "Добавить новую закачку");
HWND hWndPage = FindWindowEx(hWnd, NULL, "#32770", "Закачка");
HWND hWndEdit = GetDlgItem(hWndPage, 0x3E9);
SendMessage (hWndEdit, EM_REPLACESEL, TRUE, (LPARAM)"Text");
PostMessage (hwnd, WM_KEYDOWN, VK_RETURN, NULL);
Re[14]: Как вставить текст в Edit в другой программе?
От: old Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 06.11.02 11:47
Оценка:
Здравствуйте Zipper555, Вы писали:


Задержки не нужны такие большие — можно поменьше и не везде. И везде проверяй HWND на NULL. Если NULL — или ожидание или выход.
FindWindow не видит окно, которое спрятано чз SW_HIDE. Поэтому можно попробовать с эмулировать щелчок в трэе а потом его искать.

    HWND hwnd = ::FindWindow ("JetCar Class", NULL);    Sleep(1000);
    ::PostMessage (hwnd, WM_KEYDOWN, VK_F4, NULL);
    Sleep(1000);
    HWND hWnd = ::FindWindow("#32770", "Äîáàâèòü íîâóþ çàêà÷êó");
    Sleep(1000);
    HWND hWndPage = ::FindWindowEx(hWnd, NULL, "#32770", "Çàêà÷êà");
    Sleep(1000);
    HWND hWndEdit = ::GetDlgItem(hWndPage, 0x3E9);
    Sleep(1000);
    ::SendMessage (hWndEdit, WM_SETTEXT, 0, (LPARAM)"Text");
    Sleep(1000);
    ::PostMessage (hWndPage, WM_KEYDOWN, VK_RETURN, NULL);
    Sleep(1000);



Z>
Z>HWND hwnd = FindWindow (NULL, "Default - FlashGet");
Z>PostMessage (hwnd, WM_KEYDOWN, VK_F4, NULL);
Z>HWND hWnd = FindWindow("#32770", "Добавить новую закачку");
Z>HWND hWndPage = FindWindowEx(hWnd, NULL, "#32770", "Закачка");
Z>HWND hWndEdit = GetDlgItem(hWndPage, 0x3E9);
Z>SendMessage (hWndEdit, EM_REPLACESEL, TRUE, (LPARAM)"Text");
Z>PostMessage (hwnd, WM_KEYDOWN, VK_RETURN, NULL);
Z>
Re[15]: Как вставить текст в Edit в другой программе?
От: Zipper555  
Дата: 06.11.02 12:04
Оценка:
Здравствуйте old Dutchman,

У меня и с задержками не работает
Странно, веди если при пошаговой отладке работает, то должно и без нее работать...

А какой у вас код работает?
    HWND hwnd = ::FindWindow ("JetCar Class", NULL);    Sleep(1000);
    ::PostMessage (hwnd, WM_KEYDOWN, VK_F4, NULL);
    Sleep(1000);
    HWND hWnd = ::FindWindow("#32770", "Äîáàâèòü íîâóþ çàêà÷êó");
    Sleep(1000);
    HWND hWndPage = ::FindWindowEx(hWnd, NULL, "#32770", "Çàêà÷êà");
    Sleep(1000);
    HWND hWndEdit = ::GetDlgItem(hWndPage, 0x3E9);
    Sleep(1000);
    ::SendMessage (hWndEdit, WM_SETTEXT, 0, (LPARAM)"Text");
    Sleep(1000);
    ::PostMessage (hWndPage, WM_KEYDOWN, VK_RETURN, NULL);
    Sleep(1000);

Этот?

P.S. А в каком компиляторе вы делаете?
Re[16]: Как вставить текст в Edit в другой программе?
От: old Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 06.11.02 12:13
Оценка:
Здравствуйте Zipper555, Вы писали:

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


Z>У меня и с задержками не работает


Так посмотри, что именно перестает работать. После каждого FindWindow сделай проверку на NULL

Z>Странно, веди если при пошаговой отладке работает, то должно и без нее работать...


Z>А какой у вас код работает?

Z>
Z>    HWND hwnd = ::FindWindow ("JetCar Class", NULL);    Sleep(1000);
Z>    ::PostMessage (hwnd, WM_KEYDOWN, VK_F4, NULL);
Z>    Sleep(1000);
Z>    HWND hWnd = ::FindWindow("#32770", "Äîáàâèòü íîâóþ çàêà÷êó");
Z>    Sleep(1000);
Z>    HWND hWndPage = ::FindWindowEx(hWnd, NULL, "#32770", "Çàêà÷êà");
Z>    Sleep(1000);
Z>    HWND hWndEdit = ::GetDlgItem(hWndPage, 0x3E9);
Z>    Sleep(1000);
Z>    ::SendMessage (hWndEdit, WM_SETTEXT, 0, (LPARAM)"Text");
Z>    Sleep(1000);
Z>    ::PostMessage (hWndPage, WM_KEYDOWN, VK_RETURN, NULL);
Z>    Sleep(1000);

Z> 
Z>

Z>Этот?

Z>P.S. А в каком компиляторе вы делаете?
Re[17]: Как вставить текст в Edit в другой программе?
От: Zipper555  
Дата: 06.11.02 13:52
Оценка:
Здравствуйте old Dutchman, Вы писали:

OD>Так посмотри, что именно перестает работать. После каждого FindWindow сделай проверку на NULL


В том-то и дело, что у меня все работает, каждый дескриптор НЕ равняется NULL. Но только работает почему-то в отладке, а если просто запустить, то необходимо, чтобы этот код сработал два раза (нужно нажать на кнопку дважды).


void __fastcall TForm1::Button1Click(TObject *Sender)
{
HWND hwnd = FindWindow (NULL, "Default - FlashGet");
PostMessage (hwnd, WM_KEYDOWN, VK_F4, NULL);
HWND hWnd = FindWindow("#32770", "Добавить новую закачку");
HWND hWndPage = FindWindowEx(hWnd, NULL, "#32770", "Закачка");
HWND hWndEdit = GetDlgItem(hWndPage, 0x3E9);
SendMessage (hWndEdit, EM_REPLACESEL, TRUE, (LPARAM)("TEXT"));
PostMessage (hWnd, WM_KEYDOWN, VK_RETURN, NULL);
}
Re[18]: Как вставить текст в Edit в другой программе?
От: old Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 06.11.02 13:58
Оценка:
Здравствуйте Zipper555, Вы писали:

Расставь задержки небольшие. Если работает через раз — это задержки.

Z>
Z>void __fastcall TForm1::Button1Click(TObject *Sender)
Z>{
Z>HWND hwnd = FindWindow (NULL, "Default - FlashGet"); // надо юзать для совместимости JetCar class
Z>SendMessage (hwnd, WM_KEYDOWN, VK_F4, NULL);
Z>HWND hWnd = FindWindow("#32770", "Добавить новую закачку");
Z>HWND hWndPage = FindWindowEx(hWnd, NULL, "#32770", "Закачка");
Z>HWND hWndEdit = GetDlgItem(hWndPage, 0x3E9);
Z>SendMessage (hWndEdit, EM_REPLACESEL, TRUE, (LPARAM)("TEXT"));
Z>SendMessage (hWnd, WM_KEYDOWN, VK_RETURN, NULL);
Z>}
Z>
Re[19]: Как вставить текст в Edit в другой программе?
От: Zipper555  
Дата: 06.11.02 14:17
Оценка:
Здравствуйте old Dutchman, Вы писали:

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


OD>Расставь задержки небольшие. Если работает через раз — это задержки.


Z>>
Z>>void __fastcall TForm1::Button1Click(TObject *Sender)
Z>>{
Z>>HWND hwnd = FindWindow (NULL, "Default - FlashGet"); // надо юзать для совместимости JetCar class
Z>>SendMessage (hwnd, WM_KEYDOWN, VK_F4, NULL);
Z>>HWND hWnd = FindWindow("#32770", "Добавить новую закачку");
Z>>HWND hWndPage = FindWindowEx(hWnd, NULL, "#32770", "Закачка");
Z>>HWND hWndEdit = GetDlgItem(hWndPage, 0x3E9);
Z>>SendMessage (hWndEdit, EM_REPLACESEL, TRUE, (LPARAM)("TEXT"));
Z>>SendMessage (hWnd, WM_KEYDOWN, VK_RETURN, NULL);
Z>>}
Z>>



А почему SendMessage (hwnd, WM_KEYDOWN, VK_F4, NULL);, а не PostMessage (hwnd, WM_KEYDOWN, VK_F4, NULL);? SendMessage тоже не работает здесь, только PostMessage.

Задержки расставлял, не помогает. Хотя ща еще раз попробую.
Re[20]: Как вставить текст в Edit в другой программе?
От: old Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 06.11.02 14:42
Оценка:
Здравствуйте 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>Задержки расставлял, не помогает. Хотя ща еще раз попробую.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.