-
Как нажать кнопку "Сообщение электронной почты" в почте 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++, но я в этом не силён - ничего явного для себя не увидел.
-
с помощью 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 ...
Это как-то можно использовать?
-
Дело в том что то, что выглядит как кнопка, может быть обычной картинкой.
-
У кнопки "Сообщение электронной почты" ещё есть шуткат 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.
-
-
моя очепятка :) SpeedButton1 с Caption := 'SEND' не выполняет ни этот код: h3 := FindWindowEx(h2,0,nil,'SEND');
а с кнопкой TButton оба варианта работают... что за особенности с TSpeedButton?
-
> что за особенности с TSpeedButton?
Ну... она не кнопка, она просто выглядит так в виде картинки :)
-
Спасибо Rouse_ ©!
Ваша программа WndInfo весьма полезная штука. В итоге под маусом на TSpeedButton отображаются данные по самой форме, на коей лежит TSpeedButton.
Таже хрень и с кнопками "Сообщение электронной почты" и "Отправить". Имена классов на "Кому" (WLXDUI), "Тема" (WLXDUI) и окно ввода сообщения (Internet Explorer_Server) показывает, т.е. предполагаю, что эти элементы сообщение SendMessage(hn, WM_SETTEXT, 0, lparam(LPCTSTR('вот ты где'))) отработают. Надо проверить.
А что делать с кнопками? И в чём причина невидимости? :(
-
Если это просто картинки или ещё какие извращения :) ... Можно ли просто сделать некий псевдо_click на площади этого элемента, при этом не делая окно активный(точнее по верх остальных)?
-
-
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? ...или терь надо его "купить" и изучать?
-
Ну ты мою программу ж запустил? Стало быть координаты окна по которому она вывела данные знаешь, ну собственно туда и кликай :)
-
Если делать SetCursorPos(50,70); /// координаты взял наугад (получился как-раз центр кнопки при maximized форме; можно сделать чужую форму maximized можно, чтобы не менять и не искать новые координаты) - твоя программа в данном случае показывает координаты родителя, а элементы мимо кассы... Mouse_Event(MOUSEEVENTF_LEFTDOWN,0,0,0,0); Mouse_Event(MOUSEEVENTF_LEFTUP,0,0,0,0);
получается следующее: - окно должно быть верхним (по верх всех остальных) для щелчка или под выбранными координатами мыши хотя бы должен быть виден нужный мне элемент Можно ли этого как-то избежать???
- странно, что щёлчёк на WindowsLiveMail срабатывает только при повторе команд Mouse_Event (с остальными окнами хватает одной записи). Ну да это ладно.
-
Кроме этого, если выполнить всё нужное (выше сказанное) не прибегая к выводу формы WindowsLiveMail на передний фон и имитации нажатия мыши + вставки текста (видимо, командой Paste в активную область, выделенную мышой, и предварительно скопированную из источника) ни как нельзя, то придётся ещё на время проведения всех этих манипуляций отключать клаву и мышь, чтобы ничего не мешало наносить точечные click-и и не сбило выполнение... 8)
|