программно нажать на кнопку

Тема в разделе "WASM.WIN32", создана пользователем loleg, 15 июн 2010.

  1. loleg

    loleg New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    93
    Наткнулся на софтину, в которой стандартная вещь с SendMessage(Handle, BM_CLICK, 0, 0) не работает (окно - кнопка, хоть и нестандартного класса). Причем согласно мсдну, все должно работать (произвожу поиск окна, перебираю чайлдов, ищу по заголовку или координатам, окно СУЩЕСТВУЕТ, диалог в даный момент активен, хендлы верны) все ок.

    Return Value LRESULT от SendMessage возвращает 0, сообщения подобные BM_CLICK аля WM_DBLCKICKUP*, DOWN*, ... тоже не работают. Как программно все же ее нажать?
     
  2. jabocrack

    jabocrack New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    96
    пробовал с помощью autoit нажать?
     
  3. loleg

    loleg New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    93
    inqsoft window scanner пробовал, не работает, предположу, что неважно какой софт, сообщения те же самые
     
  4. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Если диалог не модальный, он запросто может быть неактивным.
     
  5. jabocrack

    jabocrack New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    96
    а за ссылку inqsoft window scanner большая благодарность. это получше будет чем autoit window info.
     
  6. loleg

    loleg New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    93
    и окно (TfrmMain) и кнопка не disabled иначе их нельзя было бы нажать даже вручную
     
  7. loleg

    loleg New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    93
    jabocrack
    http://s0m.narod.ru/iws_inst.zip
     
  8. jabocrack

    jabocrack New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    96
    сделй видак и кинь куда нить. посмотрим, что ты там с кнопкой вытворяешь:)))
     
  9. jabocrack

    jabocrack New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    96
    я уже скачал, обдумываю автоматизацию рутинного процесса на работе.
     
  10. loleg

    loleg New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    93
    jabocrack автоматизировать намного удобней в софте от того же автора inqsoft sign of misery
     
  11. loleg

    loleg New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    93
    сделй видак и кинь куда нить. посмотрим, что ты там с кнопкой вытворяешь:)))

    ну там и особо снимать-то нечего.
    возможно в софте, при обработки мессаджей идет какая-то фильтрация от процесса ли эксплорера приходит сообщение или нет, как это проверить?
     
  12. jabocrack

    jabocrack New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    96
    MS Spy++ тебе в помощь( функция записывать сообщения).
     
  13. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    SetActiveWindow -> SendInput
     
  14. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    или если винда 7 или виста то посмотреть сторону IAccesibleObject
     
  15. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Код (Text):
    1. void GenerateKey ( WORD vk)
    2. {
    3.          KEYBDINPUT  kinpt={0};
    4.          INPUT            inpt={0};
    5.          // generate down
    6.          inpt.type=INPUT_KEYBOARD;
    7.          kinpt.wVk=vk;
    8.          kinpt.time=NULL;
    9.          kinpt.dwExtraInfo=NULL;
    10.          kinpt.wScan=NULL;
    11.          kinpt.dwFlags=NULL;
    12.          inpt.ki=kinpt;
    13.  
    14.          SendInput(1,&inpt,sizeof(inpt));
    15.          kinpt.dwFlags=KEYEVENTF_KEYUP;
    16.          Sleep(200);
    17.          SendInput(1,&inpt,sizeof(inpt));
    18.          return;
    19. }
     
  16. loleg

    loleg New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    93
    SetActiveWindow -> SendInput
    не работает и такой метод, проверил

    jabocrack
    спасибо, сейчас затестим
     
  17. loleg

    loleg New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    93
    таки Spy++ помог
    [​IMG]
    правильно ли я понимаю исходя из даного лога, что:
    1. целевая кнопка заблокирована
    2. поскольку она заблокирована, то родительское окно обрабатывает события изменения позиции курсора и нажатия левой кнопки мышки
    3. родительское окно получает сообщение WM_MOUSEACTIVATE и отсылает кнопке сообщение MA_ACTIVATE
    4. проверяется позиция крусора мышки и в фокусе ли он, и если все верно, то обрабатывается cообщение WM_LBUTTONDOWN и оконная процедура приложения выполняет все необходимые действия
     
  18. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    MA_ACTIVATE — ответ оконной процедуры кнопки на WM_MOUSEACTIVATE. Буквы после хэндла окна обозначают смысл строки: S — SendMessage(), P — PostMessage(), R — значение, которое SendMessage() вернула.

    Что если сразу послать WM_USER+44058?
     
  19. loleg

    loleg New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    93
    Что если сразу послать WM_USER+44058?
    отослал, окно просто перерисовалось и все

    может необходимо чтобы окно было в фокусе и курсор мышки "смотрел" на кнопку
     
  20. jabocrack

    jabocrack New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    96
    судя по логу после сообщения LBUTTONDOWN у тя контрол отсылаает сообщение CM_ENTER(CM_BASE(0xB000)+26). Получает результат 0. И все. Сравни с моим логом. я нажал на кнпку process в DeDe.
    http://dump.ru/file/4638613