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[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>
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.

Задержки расставлял, не помогает. Хотя ща еще раз попробую.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.