> Подключаться к программе вроде можно в NT (запускать свой > поток в адресном пространстве чужой программы), а в W98 Только начиная с 2000.
Но если, например, у потока этого приложения есть очередь сообщений (а это, как мне показалось, действительно так), то можно поставить хук и послать ему сообщение. В обработчике хука создать поток после чего удалить хук.
Тактика такая: ищешь HWND главного окна первой проги. Далее ищешь HWND edit'a (FindWindowEx). получив HWND посылаешь ему собщение WM_GETTEXT, соответсвенно получаешь текст из edit'a. Чтобы изменить этот текст посылаешь edit'у WM_SETTEXT.
Пример:
// имя класса окна TDemoWnd
int main(int argc, char* argv[])
{
if ( (HWND hWnd = FindWindow("TDemoWnd", NULL)))
if ((hWnd = FindWindowEx(hWnd, NULL, "Edit", NULL)))
{
LPSTR text = new char[5];
SendMessage(hWnd, WM_GETTEXT, 5, (LPARAM) text); // получение текста
strcpy(text, "fuck");
// установка текста
SendMessage(hWnd, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)text);
delete[] text;
}
return 0;
}
PS:
1. Длина строки в 5 символов была взята произвольно, если текст может быть длинный - выделяй больше памяти.
2. Для выяснения именн классов окон можно использовать CopyX
3. Данная программа будет корректно работать только если у главного окна первой программы 1 дочерний edit.
а можно как-то к процессу подключиться??09.08.01 19:08 Автор: zelych Статус: Member
фишка в том, что в текст в edit надо сначала вставить, потом нажать кнопочку, и из другого edit`а прочитать..
может, первую прогу маленько подправить как-то можно чтобы в обход edit`ов и кнопки обращаться к данным..
можно и без подключений10.08.01 11:22 Автор: ukv Статус: Незарегистрированный пользователь
> фишка в том, что в текст в edit надо сначала вставить, > потом нажать кнопочку, и из другого edit`а прочитать.. > может, первую прогу маленько подправить как-то можно чтобы > в обход edit`ов и кнопки обращаться к данным..
Подключаться к программе вроде можно в NT (запускать свой поток в адресном пространстве чужой программы), а в W98 можно вовсю использовать ReadProcessMemory/WriteProcessMemory, но зачем так сложно?
Насколько я понимаю, программа заранее известна. HWND на главное окно программы лучше получать через FindWindow, а на нужные button/editbox лучше, по-моему, попробовать WindowFromPoint/ChildWindowFromPoint, предварительно сделав главному окну ShowWindow с параметром SW_MAXIMIZE (после раскрытия на максимум главного окна все дочерние встанут по фиксированным координатам на экране, и по координатам их искать легче, чем по именам).
Теперь посылка сообщений. Посылать сообщения нужно с гарантией, что они будут полностью отработаны. Посылка кликов в чужую программу через SendMessage иногда может привести к зависанию (если в ходе обработки сообщения делаются перерисовки или должны открываться какие-нибудь диалоги). Относительно безопасный способ посылки кликов - PostMessage с последующим WaitForInputIdle, например кусок из одной моей программы:
l = y;
l <<= 16;
l |= x;
PostMessage(hWnd,WM_RBUTTONDOWN,0,l);
DWORD pid;
GetWindowThreadProcessId(hWnd,&pid);
HANDLE h = OpenProcess(PROCESS_ALL_ACCESS,TRUE,pid);
WaitForInputIdle(h,INFINITE);
....
PostMessage(hMine,WM_RBUTTONUP,0,l);
WaitForInputIdle(h,INFINITE);
CloseHandle(h);
Теперь осталось немного - послать в editbox WM_SETTEXT, в button - WM_LBUTTONDOWN, потом WM_LBUTTONUP, и в другой edit - WM_GETTEXT.
если хочется подключиться13.08.01 04:13 Автор: Бяша <Biasha> Статус: Member
> Подключаться к программе вроде можно в NT (запускать свой > поток в адресном пространстве чужой программы), а в W98 Только начиная с 2000.
Но если, например, у потока этого приложения есть очередь сообщений (а это, как мне показалось, действительно так), то можно поставить хук и послать ему сообщение. В обработчике хука создать поток после чего удалить хук.