Конференция "WinAPI" » нажатие кнопки + втавка текста в чужой программе [D7, WinXP]
 
  • Dennis$ (16.12.11 23:30) [0]
    Как нажать кнопку "Сообщение электронной почты" в почте Windows Live из своей программы, а также вставить текст в открывшемся окне нового письма в поля "Кому", "Тема" и сам текст письма.

    Данный код находит только само окно Приложения.
    Кнопка, видимо, потому, что лежит не на главной форме данным способом не находится и не комманды не выполняются.

    var
    h,h1: Dword;
    begin
     if FindWindow(nil, 'Входящие - Почта Windows Live') <> 0 then begin
       ShowMessage('Windows Live Mail is running. :)')
       h := FindWindow(nil, 'Входящие - Почта Windows Live');
       h1 := FindWindowEx(h, 0, nil,'Сообщение электронной почты');
       SendMessage(h1, WM_LBUTTONDOWN, 0, 0); //// вариант 1
       SendMessage(h1, WM_LBUTTONUP, 0, 0);
       PostMessage(h1, BM_CLICK, 0, 0); ///////////// вариант 2
     else
       ShowMessage('Windows Live Mail is not running.'+#10#13+'Please start it first!');
     end;

    1. Каким образом можно перебрать все имеющиеся на форме элементы, чтобы найти кнопку по Caption "Сообщение электронной почты"???
    2. Как найти нужные поля для вставки текста и вставить текст? ("Кому", "Тема")

    Пробовал смотреть что-то с помощью Spy++, но я в этом не силён - ничего явного для себя не увидел.
  • Dennis$ (17.12.11 00:01) [1]
    с помощью Spy++ нашёл, что кнопка "Сообщение электронной почты" находится на элементе:
    ...
    +[] 000402F8 "UIRibbonDockTop" UIRibbonCommandBarDock
     +[] 000803D8 "Ribbon" UIRibbonCommandBar
       +[] 000403C0 "Ribbon" UIRibbonWorkPane
         +[] 00050324 "" NUIPane
           +[] 00050326 "" NetUIHWND
    ...

    а на открывающемся окне для нового сообщения
    кнопка "Отправить", edit-ы "Кому" и "Тема" находятся на элементе:
    ...
    +[] 0009050A "" Note Native Class
     +[] 00090510 "" WLXDUI
    ...

    а поле для ввода текста немного глубже:
    ...
    +[] 0009050A "" Note Native Class
     +[] 00090510 "" WLXDUI
       +[] 00180508 "" CtrlNotifySink
    ...

    Это как-то можно использовать?
  • Rouse_ © (17.12.11 00:30) [2]
    Дело в том что то, что выглядит как кнопка, может быть обычной картинкой.
  • Dennis$ (17.12.11 01:05) [3]
    У кнопки "Сообщение электронной почты" ещё есть шуткат Ctrl+N.
    Может этим можно как-то воспользоваться?

    Как посылать текст нашёл (например):
    var:
    h1,h2: HWND;
    begin
     h1 := FindWindow(nil, 'Form1');
     h2 := FindWindowEx(h1,0,'TRichEdit',nil);
     SendMessage(h2, WM_SETTEXT, 0, lparam(LPCTSTR('вот ты где')));
    end;

    Зная Class Name можно заслать текст. Но как его посылать, если элемент закопан глубоко, а не лежит сразу на главной форме?
    Перебирать все h1.....hn ???
     h1 := FindWindow(nil, 'Form1');
     h2 := FindWindowEx(h1,0,Class Name,nil);
     ..........
     hn := FindWindowEx(hn-1,0,Class Name,nil);
     SendMessage(hn, WM_SETTEXT, 0, lparam(LPCTSTR('вот ты где')));

    и ещё почему-то в тестовой программе-доноре (накидал на форму разных компонентов для проверки) лежащая на главной форме кнопка SpeedButton1 с Caption := 'SENDER' не выполняет ни этот код:
     h3 := FindWindowEx(h2,0,nil,'SEND');
     PostMessage(h3, BM_CLICK, 0, 0);
     ни этот:
     h3 := FindWindowEx(h2,0,nil,'SEND');
     SendMessage(h3, WM_LBUTTONDOWN, 0, 0);
     SendMessage(h3, WM_LBUTTONUP, 0, 0);
    Обращаюсь специально по caption, так как через SPY++ не вижу этой кнопки вообще, чтобы использовать Class Name.
  • Rouse_ © (17.12.11 01:22) [4]
    http://rouse.drkb.ru/winapi.php#wndinfo
    Это тебе даст инфу по окну, если окно "не окно" (ну типа твоего спидбаттона) то по крайней мере узнаешь координаты? куда письма счастья слать через http://msdn.microsoft.com/en-us/library/windows/desktop/ms646260%28v=vs.85%29.aspx
  • Dennis$ (17.12.11 01:25) [5]
    моя очепятка :)
    SpeedButton1 с Caption := 'SEND' не выполняет ни этот код:
    h3 := FindWindowEx(h2,0,nil,'SEND');

    а с кнопкой TButton оба варианта работают...
    что за особенности с TSpeedButton?
  • Rouse_ © (17.12.11 01:35) [6]

    > что за особенности с TSpeedButton?

    Ну... она не кнопка, она просто выглядит так в виде картинки :)
  • Dennis$ (17.12.11 01:37) [7]
    Спасибо Rouse_ ©!

    Ваша программа WndInfo весьма полезная штука.
    В итоге под маусом на TSpeedButton отображаются данные по самой форме, на коей лежит TSpeedButton.

    Таже хрень и с кнопками "Сообщение электронной почты" и "Отправить".
    Имена классов на "Кому" (WLXDUI), "Тема" (WLXDUI) и окно ввода сообщения (Internet Explorer_Server) показывает, т.е. предполагаю, что эти элементы сообщение SendMessage(hn, WM_SETTEXT, 0, lparam(LPCTSTR('вот ты где'))) отработают. Надо проверить.

    А что делать с кнопками? И в чём причина невидимости? :(
  • Dennis$ (17.12.11 01:40) [8]
    Если это просто картинки или ещё какие извращения :) ...
    Можно ли просто сделать некий псевдо_click на площади этого элемента,
    при этом не делая окно активный(точнее по верх остальных)?
  • Rouse_ © (17.12.11 01:44) [9]

    > Можно ли просто сделать некий псевдо_click на площади этого
    > элемента,

    Ну я-же сказал: http://msdn.microsoft.com/en-us/library/windows/desktop/ms646260%28v=vs.85%29.aspx
  • Dennis$ (17.12.11 03:50) [10]
    Rouse_,
    не дорос я ещё до понимания как это можно применить к данному случаю.
    Можли бы дать небольшую подсказку в виде кода на реализацию такого click-а.
    Тогда будет от чего оттолкнуться. :)

    Кроме этого моё предположение в посте от (17.12.11 01:37) было ошибочно.
    Это были не Имена классов самих элементов, а нечто родительское...
    До самих элементов ("Кому", "Тема" и окно ввода сообщения) так и не смог добраться.

    *******************************
    Ещё нашёл интересную инфо по существованию некого Windows Live Mail API, какраз таки для написания plug-in-ов.
    http://www.oeapi.com/site/docs/ILkAccount.html
    или здесь:
    http://www.nektra.com/products/wlmailapi-windows-live-mail-api-plugin

    Можно ли обойтись без Windows Live Mail API?
    ...или терь надо его "купить" и изучать?
  • Rouse_ © (17.12.11 04:00) [11]
    Ну ты мою программу ж запустил? Стало быть координаты окна по которому она вывела данные знаешь, ну собственно туда и кликай :)
  • Dennis$ (17.12.11 16:14) [12]
    Если делать
     SetCursorPos(50,70); /// координаты взял наугад (получился как-раз центр кнопки при maximized форме; можно сделать чужую форму maximized можно, чтобы не менять и не искать новые координаты) - твоя программа в данном случае показывает координаты родителя, а элементы мимо кассы...
     Mouse_Event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
     Mouse_Event(MOUSEEVENTF_LEFTUP,0,0,0,0);

    получается следующее:
    - окно должно быть верхним (по верх всех остальных) для щелчка или под выбранными координатами мыши хотя бы должен быть виден нужный мне элемент
    Можно ли этого как-то избежать???

    - странно, что щёлчёк на WindowsLiveMail срабатывает только при повторе команд Mouse_Event (с остальными окнами хватает одной записи). Ну да это ладно.
  • Dennis$ (17.12.11 16:25) [13]
    Кроме этого, если выполнить всё нужное (выше сказанное) не прибегая к выводу формы WindowsLiveMail на передний фон и имитации нажатия мыши + вставки текста (видимо, командой Paste в активную область, выделенную мышой,  и предварительно скопированную из источника) ни как нельзя, то придётся ещё на время проведения всех этих манипуляций отключать клаву и мышь, чтобы ничего не мешало наносить точечные click-и и не сбило выполнение...
    8)
 
Конференция "WinAPI" » нажатие кнопки + втавка текста в чужой программе [D7, WinXP]
Есть новые Нет новых   [134431   +5][b:0][p:0.001]