Программно выбрать меню в MS Office
От: Grisly  
Дата: 12.09.06 05:25
Оценка:
Здравствуйте! В общем у меня следующая проблема.. Необходимо средствами winapi активировать какой-либо элемент меню приложения MS Office, к примеру, в MS Powerpoint. Причем, элемент меню появляется в следствие установленного приложения, функциональности которого нет в объектной модели MS Office. Акселератора для требуемого мной элемента меню нет.
Задача сводится к тому, чтобы сперва отправить приложению alt+p — разворачивается меню, и далее имитировать нажатие на клавишу С.

Есть следующий экспериментальный кусок кода:

    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    CreateProcess(NULL, _T("\"c:\\Program Files\\Microsoft Office\\OFFICE11\\POWERPNT.EXE\" \"c:\\temp\\Docs\\1_1.ppt\""),
      NULL,NULL,0,0,NULL,NULL,&si,&pi);

    WaitForInputIdle( pi.hProcess, INFINITE ); 
    GUITHREADINFO gi;
    gi.cbSize = sizeof(GUITHREADINFO);

    GetGUIThreadInfo(pi.dwThreadId,&gi);

    while( SendMessage(gi.hwndActive,WM_SYSCHAR, 112, 0x60000001) ) ;    //Всё нормально, нужное мне меню разворачивается


А вот дальше как только не пытался , так и не получается сымитировать нажатие "С".

Что интересно, в MS Office нет ассоциированного с главным окном меню, все хитро сделано. Замучал бедный spy++, короче, прошу помощи, господа программисты
Freelance at http://nokc.ru
Re: Программно выбрать меню в MS Office
От: 2bas Украина  
Дата: 12.09.06 07:49
Оценка:
Здравствуйте, Grisly, Вы писали:

G>Здравствуйте! В общем у меня следующая проблема.. Необходимо средствами winapi активировать какой-либо элемент меню приложения MS Office, к примеру, в MS Powerpoint. Причем, элемент меню появляется в следствие установленного приложения, функциональности которого нет в объектной модели MS Office. Акселератора для требуемого мной элемента меню нет.

G>Задача сводится к тому, чтобы сперва отправить приложению alt+p — разворачивается меню, и далее имитировать нажатие на клавишу С.

Как через сообщения SendMessage имитировать нажатие незнаю.
Вот кусок кода доступа к меню через COM, может поможет чемто.
В нем имитируется нажатие File->SendTo->Skype.
Код конечно корявинький тут тупо идет перебор всех итемов меню и сравнивается
с искомым(может можно как то там фаинд использовать для ускорения)
Код на TestComplete, но думаю разберешся.


       
    MsPower = Sys.GetOleObject("PowerPoint.Application");
    Doc = MsPower.Presentations.Add();
    MsPower.Visible = true;
    
    var menu_file = MsPower.CommandBars("Menu Bar").Controls(1);
    var count_file = menu_file.accChildCount;
    var br = 0;
    var count = 0;
    while ( count < menu_file.accChildCount )
    {
        count++;
        
        if (  menu_file.Controls(count).Caption == "Sen&d To" )
        {
                var sendto = menu_file.Controls(count);
                var i = 0;
                while ( i < sendto.accChildCount )
                {
                        i++;
                        var s = sendto.Controls(i).Caption;
                        if (  s == "Skype" )
                        {
                                sendto.Controls(i).Execute();
                                br = 1;
                                break;
                        }
                }
        }
        if ( br == 1 ) break;
    }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.