информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Где водятся OGRыСетевые кракеры и правда о деле Левина
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] CreateProcess... 16.06.03 18:23  
Автор: Hux0r Статус: Незарегистрированный пользователь
<"чистая" ссылка> <обсуждение закрыто>
Запустил внешнее приложение с помощью CreateProcess.
А как мне передать в это запущенное приложение нажатие какой-нибудь кнопки?
Дело в том, что надо этой запущенной внешней программе передать нажатие кое-каких комбинаций клавиш, типа "открыть файл", "сохранить как...", "Exit" и т.п.
Подскажите если не трудно.
[C++] CreateProcess... 16.06.03 19:04  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
Возможно тебе помогут SendMessage, PostThreadMessage (WM_KEYDOWN\WM_KEYUP). Только надо найти нужное окно для SendMessage. А за компом в это время кто нибудь работать будет? Если нет то keybd_event можно.
[C++] Дополнение 17.06.03 01:18  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
> Возможно тебе помогут SendMessage, PostThreadMessage
> (WM_KEYDOWN\WM_KEYUP). Только надо найти нужное окно для
> SendMessage. А за компом в это время кто нибудь работать
> будет? Если нет то keybd_event можно.
Если клавиши типа button-ов или пунктов из меню, то возможно придется слать не WM_KEYUP/WM_KEYDOWN, а WM_COMMAND с соответствующими wParam/lParam
[C++] Извините, а можно поподробнее 17.06.03 09:37  
Автор: Hux0r Статус: Незарегистрированный пользователь
<"чистая" ссылка> <обсуждение закрыто>
> Если клавиши типа button-ов или пунктов из меню, то
> возможно придется слать не WM_KEYUP/WM_KEYDOWN, а
> WM_COMMAND с соответствующими wParam/lParam

Спасибо.
А можно поподробнее про использование WM_COMMAND?
Фрагмент моей программы такой:

STARTUPINFO cif;
ZeroMemory(&cif,sizeof(STARTUPINFO));
PROCESS_INFORMATION pi;
// структуры cif,pi заполняется какой-то ерундой малопонятной
// Может быть там и есть идентификатор окна запускаемого приложения?
// Попытка запуска блокнота
if (CreateProcess(NULL,"notepad",NULL,NULL,FALSE,CREATE_DEFAULT_ERROR_MODE,NULL,NULL,&cif,&pi) == true)
{
Теперь надо послать ему сообщения нажатия, допустим, "Enter"
Но как это сделать?
если использовать WM_COMMAND, то какие параметры-то передавать?
а если SendMessage, то как узнать Идентификатор окна?
}

---
Если не трудно, может допишете кусок программы, мне так легче будет понять чем лазить на microsoft.com по MSDN.
[C++] Извините, а можно поподробнее 17.06.03 16:18  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
> Спасибо.
> А можно поподробнее про использование WM_COMMAND?
ну если программа которую запускаешь не твоя то тут возникает проблема узнать какой Command соответствует какой менюшке. Я бы наверно если бы приспичило написал маленькую программу которая ставит хук (SetWindowsHookEx) на GetMessage интересующей меня программы кликал на менюшки и потом смотрел с какими параметрами приходит WM_COMMAND
> Фрагмент моей программы такой:
>
>

> STARTUPINFO cif;
> ZeroMemory(&cif,sizeof(STARTUPINFO));
> PROCESS_INFORMATION pi;
> // структуры cif,pi заполняется какой-то ерундой
> малопонятной
> // Может быть там и есть идентификатор окна запускаемого
> приложения?
нет. идентификатор можно найти так: вызываешь EnumWindows и перечисляешь все окна, находишь среди них то что тебе подходят - в данном случае имеет класс "Notepad" и GetWindowThreadProcessId возвращет ID из CreateProcess

> Если не трудно, может допишете кусок программы, мне так
> легче будет понять чем лазить на microsoft.com по MSDN.
трудно Ж\. А MSDN надо иметь у себя на винте. Без него никак.
[C++] уже проще ) 17.06.03 16:45  
Автор: Hux0r Статус: Незарегистрированный пользователь
<"чистая" ссылка> <обсуждение закрыто>
Спасибо.
идентификатор нашел, все нормально. Экспериментальным путем нашел в меню блокнота Command на раздел меню "Открыть файл". Он равен 10.
т.е. посылаю сообщение таким образом:
SendMessage(hwin,WM_COMMAND,10,0);
// Открывается окошко "Открыть файл". Это все работает.
//Но следующая конструкция уже почему-то не работает:
SendMessage(hwin,WM_KEYDOWN,65,0);
SendMessage(hwin,WM_KEYUP,65,0);
// т.е. посылаю нажатие и отпускание кнопки "A"
// Или нужно искать хендл и для этого диалогового окна тоже?
// Оно же вроде дочернее блокноту?


// а сообщения
SendMessage(hwin,WM_KEYDOWN,65,0);
SendMessage(hwin,WM_KEYUP,65,0);
// которые я посылаю непосредственно блокноту, тоже не работают
// Ведь по идее в блокноте должен напечататься символ 0х41 "A"
// или я чего-то не в том направлении иду?
[C++] Не так 17.06.03 17:01  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
> SendMessage(hwin,WM_COMMAND,10,0);
> // Открывается окошко "Открыть файл". Это все работает.
> //Но следующая конструкция уже почему-то не работает:
> SendMessage(hwin,WM_KEYDOWN,65,0);
> SendMessage(hwin,WM_KEYUP,65,0);
> // т.е. посылаю нажатие и отпускание кнопки "A"
> // Или нужно искать хендл и для этого диалогового окна
> тоже?
> // Оно же вроде дочернее блокноту?
Теперь тебе нужно найти окно этого диалога и DlgItem соответствующий EditBox-у с именем файла. После этого послать туда WM_SETTEXT или сделать SetWindowText(), а лучше воспользоваться макросом из windowsx.h Edit_SetText()

После заполнения едита сделать WM_COMMAND с кодом клавиши OK.

> // или я чего-то не в том направлении иду?

Одна проблема - для разных версия нотепадов и коммон диалогов DlgItem-ы могут быть разные. Если ты делаешь прогу не только для себя, лучше динамически перечислять все дочерние окна и находить по надписи на кнопке или по положению или еще как реальный DlgItem ID.
[C++] Опять траблы... 18.06.03 13:43  
Автор: Hux0r Статус: Незарегистрированный пользователь
<"чистая" ссылка> <обсуждение закрыто>

> Теперь тебе нужно найти окно этого диалога и DlgItem
> соответствующий EditBox-у с именем файла. После этого
> послать туда WM_SETTEXT или сделать SetWindowText(), а
> лучше воспользоваться макросом из windowsx.h Edit_SetText()
>
> После заполнения едита сделать WM_COMMAND с кодом клавиши
> OK.
>
> > // или я чего-то не в том направлении иду?
>
> Одна проблема - для разных версия нотепадов и коммон
> диалогов DlgItem-ы могут быть разные. Если ты делаешь прогу
> не только для себя, лучше динамически перечислять все
> дочерние окна и находить по надписи на кнопке или по
> положению или еще как реальный DlgItem ID.
Процедура которая перечисляет дочерние окна
BOOL EnumChildWindows(
HWND hWndParent, // дескриптор родительского окна
WNDENUMPROC lpEnumFunc, // указатель на функцию обратного вызова
LPARAM lParam // определенное приложением значение
)
вызывает искючение какое-то...
Насколько я понимаю, в первый параметр "HWND hWndParen" я пихаю хендл найденного блокнота
во второй - "LPARAM lParam" - NULL
А что вставлять в третий параметр "WNDENUMPROC lpEnumFunc" ?
Мне же ведь нужно получить дескриптор дочернего окна, куда же он возвращается?

И еще проблема. Я показал это все на примере блокнота, а он имеет стабильный ClassName ="Notepad".
А вообще-то мне надо находить дескриптор программы 1С: Предприятие, а у него ClassName меняющийся, т.е. мне нужно делать выборку всех окон
Пользуюсь функцией
HWND firstwin, Handle;
firstwin=GetWindow(Handle,GW_HWNDFIRST);
// должен получить первое попавшееся окно,
// но она возвращает NULL
Параметр Handle - вроде как начальный дескриптор, я туда ничего не ставлю, может быт его надо как то определить?
[C++] Тяжело жить без мсдн-а :-) 18.06.03 15:21  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
> Насколько я понимаю, в первый параметр "HWND hWndParen" я
> пихаю хендл найденного блокнота
> во второй - "LPARAM lParam" - NULL
> А что вставлять в третий параметр "WNDENUMPROC lpEnumFunc"
В первый ты пихаешь хендл окна, детей которого хочешь перечислить. Второй параметр колбяка которую будет вызывать винда для каждого найденного окна, третий - любое значение, в твоем случае (только одно использование колбяки) его понимание вообще не нужно - пиши туда что хочешь.

> Мне же ведь нужно получить дескриптор дочернего окна, куда
> же он возвращается?
Все дочерние окна по очереди возвращаются в функцию lpEnumFunc. А там ты можешь делать с ними все что хочешь.

> firstwin=GetWindow(Handle,GW_HWNDFIRST);
> // должен получить первое попавшееся окно,
> // но она возвращает NULL
> Параметр Handle - вроде как начальный дескриптор, я туда
> ничего не ставлю, может быт его надо как то определить?
Как это ничего? NULL в смысле? Вот и получаешь первое окно того же типа стоящее выше всего по Z. Вообще-то MSND говорит, что использование EnumChildWindows предпочтительнее, чем использование GetWindow в цикле. А в качестве начального окна можешь пользоваться предопределенным HWND_DESKTOP (хотя это и есть NULL, но работать должно)
[C++] Еще маленькая трабла :) 19.06.03 16:07  
Автор: Hux0r Статус: Незарегистрированный пользователь
<"чистая" ссылка> <обсуждение закрыто>
Спасибо за все ваши советы, научился я находить окна, перечислять их дочерние окна, передавать сообщения в Edit-ы, button-ы и пр. Все прекрасно работает.
Одна только проблема:
В блокноте, для того чтобы вызвать диалог "открыть файл", я передавал такое сообщение:
PostMessage(hWindow1C, WM_COMMAND, 10, NULL);
В программе 1С:Предприятие, такое не проходит, перебрал в цикле все параметры wParam от 0 до тысяч :) и никакого эффекта.
В её дочерних же окнах, никакой информации о менюшках нет.
Фактически мне нужно просто программно нажать сочетание клавиш "ctrl+o", для появления окна диалога "открыть".
Но как это сделать?
После нахождения идентификатора самого 1С, чего я только ей не слал, WM_KEYDOWN,WM_KEYUP, со значениями в wParam кнопок альт, контрол, буквы. Все бесполезно.
Если принципиально нельзя послать окну именно сочетание клавиш, то вероятно, придется искать id менюшек. Но как это сделать?
[C++] Есть редакторы ресурсов 19.06.03 16:30  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
> клавиш, то вероятно, придется искать id менюшек. Но как это
> сделать?
Например, ResHacker, ExeScope и т.п.
В них можно просмотреть диалоги приложения. Хотя если оно написано на чем нибудь от Борланда, то все диалоги создаются динамически из паскалеподобного описания.

Тогда лучше искать окно (окно DlgItem-а) как нибудь иначе. По классу, по положению, по caption-у в конце концов.

Кроме того можно посмотреть какие сообщения приходят в окно в штатном режиме. Тут может помочь утилса Spy++ из Microsoft Visual Studio Tools
[C++] Редакты ресурсов ничего не находят 19.06.03 16:43  
Автор: Hux0r Статус: Незарегистрированный пользователь
<"чистая" ссылка> <обсуждение закрыто>
Редакты ресурсов ничего не находят
А можно узнать поподробнее как искать окна DlgItem-а даже хоть по caption-у?
Какие функции сдесь применять?
[C++] Редакты ресурсов ничего не находят 19.06.03 17:10  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
> Редакты ресурсов ничего не находят
я уже советовал - поставить хук типа WH_GETMESSAGE, смотреть какие WM_COMMAND приходят нужному окну и писать их в лог.
> А можно узнать поподробнее как искать окна DlgItem-а даже
> хоть по caption-у?
> Какие функции сдесь применять?
Я пользуюсь утилитой под названием spy.exe. Вобщем она делает так - наводишь мышью на окно или контрол и она пишет про него все. Вобщем такое несложно написать самому - WindowFromPoint, GetClassName и тп
[C++] Ну а я утилсой spyxx.exe из Visual Studio - и она не раз меня выручала 19.06.03 20:53  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
> я уже советовал - поставить хук типа WH_GETMESSAGE,
> смотреть какие WM_COMMAND приходят нужному окну и писать их
> в лог.
Она может ловить это

> Я пользуюсь утилитой под названием spy.exe. Вобщем она
> делает так - наводишь мышью на окно или контрол и она пишет
> про него все. Вобщем такое несложно написать самому -
> WindowFromPoint, GetClassName и тп
В spy++ нужно перетащить специальную иконку на нужное окно. При этом рамка окна, над которым находится иконка подсвечиватся чтоб знать что именно это тебе нужно. После выбора окна можно начинать ловить его сообщения. Причем с весьма полными фильтрами.
[C++] нашел! 19.06.03 17:03  
Автор: Hux0r Статус: Незарегистрированный пользователь
<"чистая" ссылка> <обсуждение закрыто>
Спасибо, нашел ресурсы меню, все получилось, параметр на вызов диалога открытия файла - 57601.
Все работает.
Но все-таки хотелось бы узнать, если можно, как искать окна DlgItem-а ?
[C++] Не так 17.06.03 21:13  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
> Одна проблема - для разных версия нотепадов и коммон
> диалогов DlgItem-ы могут быть разные. Если ты делаешь прогу
> не только для себя, лучше динамически перечислять все
> дочерние окна и находить по надписи на кнопке или по
> положению или еще как реальный DlgItem ID.
вроде FindWindowEx(notepadwnd,0,"Edit",0) должно везде пахать
[C++] Не так 18.06.03 14:56  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
> вроде FindWindowEx(notepadwnd,0,"Edit",0) должно везде
> пахать
WindowText может зависить от локализации. Но это уже совсем жестоко. Легче проверять версию и смотреть номер итема в зависимости от нее. И вписать в ридми список поддерживаемых версий.
[C++] Не так 18.06.03 15:13  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
> > вроде FindWindowEx(notepadwnd,0,"Edit",0) должно везде
> > пахать
> WindowText может зависить от локализации. Но это уже совсем
> жестоко. Легче проверять версию и смотреть номер итема в
> зависимости от нее. И вписать в ридми список поддерживаемых
> версий.
ты перепутал. здесь "Edit" -это имя класса, оно во всех виндах есть и в блокноте юзается. А WindowsText как видишь я поставил в 0, то бишь любой
[C++] Да прогнал :-) 18.06.03 15:32  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
[C++] и посылать лучше с помощью PostMessage 17.06.03 21:25  
Автор: dl <Dmitry Leonov>
<"чистая" ссылка> <обсуждение закрыто>
С ней работаю пользователя имитируется более естественно, плюс уходят затраты на ожидание реакции приложения. По крайней мере, у меня были случаи, когда SendMessage не срабатывал как хотелось.
1  |  2 >>  »  




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach