так сделал бы так сразу и не надо было лезть на форум, а то взяли привычку. сделал глупость, нет чтоб разобраться, надо по форумам пофлудить! а то профи нашелся. элементарного не видит. я бы рассказал что тебе надо поправить, но такое надо учиться самому находить. вот тебе метод - осваивай, а то в профи записался! а WM_MOUSEDOWN/WM_MOUSEUP или WM_MOUSEDBLCLICK не сутьба! еще раз повторюсь!
max7C4 Я в профи не записывался. Судя вашей логике форум тогда не нужен будет. Может тогда уже сделать с форума переадресацию сразу на MSDN ?? Ваших сообщений: просто не существует, возможно вы имели ввиду WM_MBUTTONDOWN, но она не подходит для решения моей задачи. Уж сомневаюсь я что-то. Флудиш пока что, только ты. P.S. Ну что за моду взяли - тыкать в MSDN ... ппц . l_inc тоже мне советовал MSDN, но здесь сразу видно, человек владеет знанием в вопросе, и я к нему прислушиваюсь... А ты, max7C4, пытаешься дать совет хотя сам не в теме. Во всяком случае у меня такое впечатление. Да я не проф, когда есть возможность и необходимость я лезу в MSDN и не только туда.
ntp > возможно вы не читали здесь все посты Я обратил внимание на: ntp #1 > "окно класса и заголовка не имеет ... этом окне нужно нажать кнопку ... еще проблема с другим окном, класс которого известен, а вот у кнопок на этом окне нет загаловка ... нужно понажимать на кнопки" ntp #12 > "найти хэндлы кнопок без заголовка, на форме с известным классом" ntp #18 > "Для обычных кнопок это канает, но на тех кнопках, которых мне нужно не работает" Я что-то упустил? ntp #20 > класс окна на котором расположена кнопка и класс кнопки мне известны А, например, мне до сих пор нет, как можно при этом советовать/комментировать использование BM_CLICK, WM_KEYDOWN, WM_MBUTTONDOWN etc?
ntp Думаю, что max7C4 имел в виду WM_LBUTTONDOWN/WM_LBUTTONUP. По идее должны подойти. winuser.h подключается автоматически, если Вы подключаете windows.h (подключать winuser.h отдельно не нужно). Не знаю, почему так сделано, но GetAncestor в winuser.h подключается только для windows >= 2k. Соответственно, перед подключением windows.h нужно указать #define WINVER 0x500.
To q_q Не понял Вас. Я говорю что мне известно название класса окна (утилита spy) и название класса кнопки тоже известно. И поэтому я хэндл искомой кнопки и нахожу. Проблема вот в чем: не могу программно нажать на кнопку. SendMessage не работает. To l_inc Понял, спасибо. По поводу WM_LBUTTONDOWN, работает но как то странно, похоже кнопки теперь стали каждый раз по разному перечисляться. И поэтому нажимаются разные кнопки если прогу перезапускать. Уф... запутался что-то. Писал так: SendMessage(hwnd, WM_LBUTTONDOWN ,MK_LBUTTON,0); SendMessage(hwnd, WM_LBUTTONUP ,MK_LBUTTON,0); Хочу еще сказать, что такой код точно работает у меня если хэндл кнопки мне известен заранее, а не находится в процессе перечисления EnumChildWindows.
))) это означает нажать левую кнопку мыши при нажатой левой кнопке мыши )) правильно: SendMessage(hwnd, WM_LBUTTONDOWN ,0,0);
ntp > Не понял Вас. Я прошу тебя написать название класса окна, которое ты уже 20 часов называешь кнопкой. Кстати о Spy'е: если нажимать кнопку мышкой/клавиатурой, то какие сообщения получет она и окно, на котором она размещена.
Y_Mur Да... смешно... Но проблема осталась ) Код привожу: Здесь: gg - счетчик, например, если мне нужна 3 кнопка то я делаю условие и вызываю SendMessageю. Может опять что не так делаю...
да я имел ввиде именно WM_LBUTTONDOWN/WM_LBUTTONUP, но по привычке L - не указывал, да и оставшиеся две кнопки можете попробовать, но лучше покопаться в коде и сделать обход этих сбщ!
q_q название класса окна ? "MainWind" название класса окна с кнопкой "ButtonClass" название класса кнопки Только что это даст Вам ? l_inc Была идея, использовать для этого GetWindowRect , но по-видимому она не работает с элементами управления. Там исключение возникало. А как Вы думаете сверять координаты ?
ntp Именно так и думал. Плюс не с абсолютными координатами работать, конечно, а воспользоваться ScreenToClient, например. GetWindowRect должна работать. Исключение могло возникать из-за неверно переданного адреса структуры RECT.
ntp А может стоит попробовать посылать WM_LBUTTONDOWN/WM_LBUTTONUP не кнопке а диалогу, указав в lparam координаты нужной кнопки (есно координаты относительные поэтому должны попадать куда надо даже если диалог отображён в разных местах экрана).
l_inc, Y_Mur По поводу нахождения координат, а точнее длины и высоты кнопок: rect объявлена глобально как RECT... Исключение не возникает, значит в прошлый раз неправильно сделал что-то. Этот код работает ) ... но, когда я вставляю вместо printf вызовы SendMessage странно кнопки нажмаются... то все не те которые надо, то как-будто все выполняют одно и тоже действие. Мда... Затянулась реализация на первый взгляд, простой задачи) Может мне сказать название проги и выложить исходный код своей программы ?
Короч, прога эта, моя подопытная - CureIt Обобщу проблему: после запуска там появиться зеленое окно, с кнопками "Пуск", "Обновить" и др. Задача: нажать на кнопку "Пуск". Вроде бы эта кнопка имеет длину 73. "Нажалась" она у меня пару раз, в остальные разы нажимались другие, хотя код я запускал неизменный. Что не так - не пойму. Вот код который я компилил и запускал: Просьба к тем кто заинтересовался, запустить проги, проверить, отписаться о результатах.
ntp Дошли руки посмотреть Ваш CureIt. Значит смысл в том, что нажатие-то Вы посылаете кнопке пуск, но вот она в свою очередь передаёт информацию о нажатии главному окну. А его не особо заботит, от какого контрола ему пришло сообщение о нажатии. Он определяет, что делать, по тому, какой контрол на данный момент активен (последний, по которому пробежал курсор). Если Вы провели курсором по кнопке закрытия окна, когда у главного окна в последний раз был фокус, то нажатие на кнопку закрытия окна и будет обработано не зависимо от того, какому контролу Вы послали WM_LBUTTONUP. Поэтому предварительно главному окну нужно послать сообщение WM_MOUSEMOVE с координатами кнопки "пуск" на главном окне.
// "ntp_" это "ntp" o_O l_inc Спасибо, убедился в том что вы сказали. Но у меня опять какая-то проблема с реализацией ). Когда я посылаю главному окну WM_MOUSEMOVE я в lparam запихиваю DWORD, младшее слово которого это координата X, а старшее Y. ...мм не работает xD. То есть как-будто окно ничего не приняло. Нет сомнений, я что-то делаю не так. Скажите пожалуйста, что именно ?
ntp_ У меня нет возможности сейчас проверить (на лекции по линейной алгебре сижу ), так что на правах предположений: 1) Вы уверены, что GetParent возвращает хэндл основного окна? В общем можно попробовать, конечно, GetAncestor(GA_ROOT), что обычно и делают для получения самого старшего окна в дереве. Но в данном случае хэндл легче передавать прямо в EnumChildWindows третьим параметром (второй параметр EnumChildProc), чем искать его отдельно. 2) А что Вам так нравится сообщения на верхний левый угол передавать? Попробуйте указать координаты по ближе к середине кнопки. 3) Мелкие замечания... вообще си поддерживает операторы вида tmp<<=16 и tmp|=recta.left-recta_f.left .
l_inc Прибавил к координатам по единичке (можно и более) , так сказать, сместился ближе к центру и все заработало ! Странно, но получается что сама кнопка фактически начинается с x+1'ой (y+1'ой) координаты. Еще раз благодарю за внимание l_inc. Сказал что странно... пожалуй не странно, просто так работает функция GetWindowRect. Думаю, тема исчерпана.
Нее... тема еще не исчерпана )) Я тут последние дни не могу заставить работать свою программу. Точнее, мне нужно всего выполнить последовательно три шага: 1. Найти кнопку "Отмена" и нажать на нее. 2. Найти кнопку "Пуск" и нажать на нее. 3. Найти кнопку "OK" и нажать на нее. Беда в том что эти шаги выполняются , но только по отдельности. Сразу подряд, у меня получается выполнить только первые два шага, а третий ну никак не срабатывает. Я тут исходник прикрепил небольшой, там немного коментов. Буду признателен если кто-нибудь наставит меня на путь истинный.