Поиск хэндла диалогового окна

Тема в разделе "WASM.WIN32", создана пользователем ntp, 7 ноя 2008.

  1. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    так сделал бы так сразу и не надо было лезть на форум, а то взяли привычку. сделал глупость, нет чтоб разобраться, надо по форумам пофлудить! а то профи нашелся. элементарного не видит. я бы рассказал что тебе надо поправить, но такое надо учиться самому находить. вот тебе метод - осваивай, а то в профи записался! а WM_MOUSEDOWN/WM_MOUSEUP или WM_MOUSEDBLCLICK не сутьба! еще раз повторюсь!
     
  2. ntp

    ntp New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2008
    Сообщения:
    30
    max7C4
    Я в профи не записывался. Судя вашей логике форум тогда не нужен будет. Может тогда уже сделать с форума переадресацию сразу на MSDN ??

    Ваших сообщений:
    просто не существует, возможно вы имели ввиду WM_MBUTTONDOWN, но она не подходит для решения моей задачи.

    Уж сомневаюсь я что-то.

    Флудиш пока что, только ты.

    P.S. Ну что за моду взяли - тыкать в MSDN ... ппц .
    l_inc тоже мне советовал MSDN, но здесь сразу видно, человек владеет знанием в вопросе, и я к нему прислушиваюсь... А ты, max7C4, пытаешься дать совет хотя сам не в теме. Во всяком случае у меня такое впечатление.
    Да я не проф, когда есть возможность и необходимость я лезу в MSDN и не только туда.
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    ntp
    > возможно вы не читали здесь все посты
    Я обратил внимание на:
    ntp #1 > "окно класса и заголовка не имеет ... этом окне нужно нажать кнопку ... еще проблема с другим окном, класс которого известен, а вот у кнопок на этом окне нет загаловка ... нужно понажимать на кнопки"
    ntp #12 > "найти хэндлы кнопок без заголовка, на форме с известным классом"
    ntp #18 > "Для обычных кнопок это канает, но на тех кнопках, которых мне нужно не работает"
    Я что-то упустил?

    ntp #20 > класс окна на котором расположена кнопка и класс кнопки мне известны
    А, например, мне до сих пор нет, как можно при этом советовать/комментировать использование BM_CLICK, WM_KEYDOWN, WM_MBUTTONDOWN etc?
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    ntp
    Думаю, что max7C4 имел в виду WM_LBUTTONDOWN/WM_LBUTTONUP. По идее должны подойти.
    winuser.h подключается автоматически, если Вы подключаете windows.h (подключать winuser.h отдельно не нужно). Не знаю, почему так сделано, но GetAncestor в winuser.h подключается только для windows >= 2k. Соответственно, перед подключением windows.h нужно указать #define WINVER 0x500.
     
  5. ntp

    ntp New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2008
    Сообщения:
    30
    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.
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    :))))
    это означает нажать левую кнопку мыши при нажатой левой кнопке мыши :)))
    правильно:
    SendMessage(hwnd, WM_LBUTTONDOWN ,0,0);
     
  7. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    ntp
    > Не понял Вас.
    Я прошу тебя написать название класса окна, которое ты уже 20 часов называешь кнопкой.
    Кстати о Spy'е: если нажимать кнопку мышкой/клавиатурой, то какие сообщения получет она и окно, на котором она размещена.
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    ntp
    Можно попробовать сверять координаты.
     
  9. ntp

    ntp New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2008
    Сообщения:
    30
    Y_Mur
    Да... смешно... Но проблема осталась )
    Код привожу:
    Здесь: gg - счетчик, например, если мне нужна 3 кнопка то я делаю условие и вызываю SendMessageю.
    Может опять что не так делаю...
     
  10. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    да я имел ввиде именно WM_LBUTTONDOWN/WM_LBUTTONUP, но по привычке L - не указывал, да и оставшиеся две кнопки можете попробовать, но лучше покопаться в коде и сделать обход этих сбщ!
     
  11. ntp

    ntp New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2008
    Сообщения:
    30
    q_q
    название класса окна ?
    "MainWind" название класса окна с кнопкой
    "ButtonClass" название класса кнопки
    Только что это даст Вам ?

    l_inc
    Была идея, использовать для этого GetWindowRect , но по-видимому она не работает с элементами управления. Там исключение возникало. А как Вы думаете сверять координаты ?
     
  12. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    ntp
    Именно так и думал. Плюс не с абсолютными координатами работать, конечно, а воспользоваться ScreenToClient, например. GetWindowRect должна работать. Исключение могло возникать из-за неверно переданного адреса структуры RECT.
     
  13. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    ntp
    А может стоит попробовать посылать WM_LBUTTONDOWN/WM_LBUTTONUP не кнопке а диалогу, указав в lparam координаты нужной кнопки (есно координаты относительные поэтому должны попадать куда надо даже если диалог отображён в разных местах экрана).
     
  14. ntp

    ntp New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2008
    Сообщения:
    30
    l_inc, Y_Mur
    По поводу нахождения координат, а точнее длины и высоты кнопок:
    rect объявлена глобально как RECT... Исключение не возникает, значит в прошлый раз неправильно сделал что-то. Этот код работает ) ... но, когда я вставляю вместо printf вызовы SendMessage странно кнопки нажмаются... то все не те которые надо, то как-будто все выполняют одно и тоже действие.
    Мда... Затянулась реализация на первый взгляд, простой задачи)
    Может мне сказать название проги и выложить исходный код своей программы ?
     
  15. ntp

    ntp New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2008
    Сообщения:
    30
    Короч, прога эта, моя подопытная - CureIt :)
    Обобщу проблему: после запуска там появиться зеленое окно, с кнопками "Пуск", "Обновить" и др. Задача: нажать на кнопку "Пуск". Вроде бы эта кнопка имеет длину 73. "Нажалась" она у меня пару раз, в остальные разы нажимались другие, хотя код я запускал неизменный. Что не так - не пойму. Вот код который я компилил и запускал:
    Просьба к тем кто заинтересовался, запустить проги, проверить, отписаться о результатах.
     
  16. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    ntp
    Дошли руки посмотреть Ваш CureIt. Значит смысл в том, что нажатие-то Вы посылаете кнопке пуск, но вот она в свою очередь передаёт информацию о нажатии главному окну. А его не особо заботит, от какого контрола ему пришло сообщение о нажатии. Он определяет, что делать, по тому, какой контрол на данный момент активен (последний, по которому пробежал курсор). Если Вы провели курсором по кнопке закрытия окна, когда у главного окна в последний раз был фокус, то нажатие на кнопку закрытия окна и будет обработано не зависимо от того, какому контролу Вы послали WM_LBUTTONUP. Поэтому предварительно главному окну нужно послать сообщение WM_MOUSEMOVE с координатами кнопки "пуск" на главном окне.
     
  17. ntp_

    ntp_ New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    47
    // "ntp_" это "ntp" o_O

    l_inc
    Спасибо, убедился в том что вы сказали. Но у меня опять какая-то проблема с реализацией ). Когда я посылаю главному окну WM_MOUSEMOVE я в lparam запихиваю DWORD, младшее слово которого это координата X, а старшее Y. ...мм не работает xD. То есть как-будто окно ничего не приняло.
    Нет сомнений, я что-то делаю не так. Скажите пожалуйста, что именно ?
     
  18. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    ntp_
    У меня нет возможности сейчас проверить (на лекции по линейной алгебре сижу :)), так что на правах предположений:
    1) Вы уверены, что GetParent возвращает хэндл основного окна? В общем можно попробовать, конечно, GetAncestor(GA_ROOT), что обычно и делают для получения самого старшего окна в дереве. Но в данном случае хэндл легче передавать прямо в EnumChildWindows третьим параметром (второй параметр EnumChildProc), чем искать его отдельно.
    2) А что Вам так нравится сообщения на верхний левый угол передавать? Попробуйте указать координаты по ближе к середине кнопки.
    3) Мелкие замечания... вообще си поддерживает операторы вида tmp<<=16 и tmp|=recta.left-recta_f.left .
     
  19. ntp_

    ntp_ New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    47
    l_inc
    Прибавил к координатам по единичке (можно и более) , так сказать, сместился ближе к центру и все заработало ! Странно, но получается что сама кнопка фактически начинается с x+1'ой (y+1'ой) координаты. Еще раз благодарю за внимание l_inc.

    Сказал что странно... пожалуй не странно, просто так работает функция GetWindowRect.

    Думаю, тема исчерпана.
     
  20. ntp_

    ntp_ New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    47
    Нее... тема еще не исчерпана ))
    Я тут последние дни не могу заставить работать свою программу. Точнее, мне нужно всего выполнить последовательно три шага:
    1. Найти кнопку "Отмена" и нажать на нее.
    2. Найти кнопку "Пуск" и нажать на нее.
    3. Найти кнопку "OK" и нажать на нее.
    Беда в том что эти шаги выполняются , но только по отдельности. Сразу подряд, у меня получается выполнить только первые два шага, а третий ну никак не срабатывает. Я тут исходник прикрепил небольшой, там немного коментов. Буду признателен если кто-нибудь наставит меня на путь истинный.