Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Получить меню стороннего окна

27K
20 мая 2010 года
snubrik
10 / / 22.07.2007
Доброго всем утра.

Суть проблема такова.
Хочу получить меню сторонний программы и отправить команду на выполнения пункта меню.
При выполнении одного из пунктов меню появится TextBox и Button в TextBox нужно вбить автоматом нужные слова, ну а Button нажать.

Если подскажите в каком направлении читать, буду благодарен.
Рабочий код не прошу, конечно не откажусь если у кого-то есть что-то похожее, но вот направление в какую сторону копать очень хотелось бы понять.
399
20 мая 2010 года
KIV
432 / / 20.01.2009
SendMessage(хендл_окна_программы, WM_COMMAND, номер_команды_меню, 0);
Это для выполнения пункта меню.
Затем FindWindowEx (для поиска окна диалога и поиска на нём TextBox и Button). И наконец SetWindowText (для TextBox) и SendMessage (для Button).
27K
20 мая 2010 года
snubrik
10 / / 22.07.2007
FindWindowEx - это уже на тестовой прожке сделал.
А за
SendMessage(хендл_окна_программы, WM_COMMAND, номер_команды_меню, 0); прибольшущее спасибо. Сейчас буду ковырять
SetWindowText - про это я так вообще не был в курсе. =(

Спасибо. Погнла мучать программу.
27K
27 мая 2010 года
snubrik
10 / / 22.07.2007
Возникла проблема
Вроде как я нахожу номер пункта меню, но сообщение о нажатии на него ни как не идет.
Код ниже. Он находит все пункты меню и подменю.
В буфере обмена весит запись, которая вставляется при нажатии CTRL+V
Где мое не понимание зарылось?

Код:
public const int WM_COMMAND = 273;
...
...
...

iHandle = GetWmpHandle();
wParam_set = (int)GetMenuItemId(iHandle, "&Правка", "Вст&авить    CTRL+V");
IntPtr hEdit = FindWindowEx((IntPtr)iHandle, IntPtr.Zero, "Edit", "");
PostMessage((IntPtr)hEdit, WM_COMMAND, (IntPtr)wParam_set, IntPtr.Zero);


private System.Int32 GetWmpHandle()
        {
            // start with the top window on the Desktop

            int window_handle = GetTopWindow(GetDesktopWindow());
            StringBuilder text_stringBuilder = new StringBuilder(0x20);
            String wmpText_string = "Безымянный — Блокнот";
            StringBuilder class_stringBuilder = new StringBuilder(0x20);
            String wmpClass_string = "Notepad";
            bool b;
            try
            {
                while (true)
                {
                    // look at each Desktop window...

                    GetWindowText(window_handle,
                          text_stringBuilder, 0x20);
                    if (window_handle == 68240)
                        b = true;
                    if (text_stringBuilder.ToString().StartsWith(
                                               wmpText_string))
                    {
                        // ...until you find one whose name starts

                        //    with "Windows Media Player"

                        RealGetWindowClass(window_handle,
                                    class_stringBuilder, 0x20);
                        if (class_stringBuilder.ToString().StartsWith(
                                                   wmpClass_string))
                        {
                            // ...and has a class name

                            //    that starts with "WMPlayerApp"

                            return window_handle;
                        }
                    }
                    if ((window_handle = GetWindow(window_handle,
                         GW_HWNDNEXT)) == 0)
                    {

                        return 0;
                    }
                }
            }
            catch (Exception e) { return 0; }
        }

private System.UInt32 GetMenuItemId(int hWnd,
        String menuItem_string, String submenuItem_string)
        {
            // get the main application menu

            System.Int32 hMenu = GetMenu(hWnd);
            int count = GetMenuItemCount(hMenu);
            int menuItemIndex;
            System.Text.StringBuilder menuItem =
                       new System.Text.StringBuilder(0x20);

            menuItemIndex = -1;
            for (int i = 0; i < count; i++)
            {
                // loop through main menu...

                GetMenuString(hMenu, (uint)i, menuItem,
                                  0x20, MF_BYPOSITION);
                if (menuItem.ToString().StartsWith(menuItem_string))
                {
                    menuItemIndex = i;
                    break;
                }
            }
            if (menuItemIndex < 0) { return 0; }
            hMenu = GetSubMenu(hMenu, menuItemIndex);
            count = GetMenuItemCount(hMenu);
            menuItemIndex = -1;
            for (int i = 0; i < count; i++)
            {
                // loop through sub menu...

                GetMenuString(hMenu, (uint)i,
                      menuItem, 0x20, MF_BYPOSITION);
                if (menuItem.ToString().StartsWith(submenuItem_string))
                {
                    menuItemIndex = i;
                    break;
                }
            }
            if (menuItemIndex < 0) { return 0; }
            return GetMenuItemID(hMenu, menuItemIndex);
        }
14
27 мая 2010 года
Phodopus
3.3K / / 19.06.2008
PostMessage((IntPtr)iHandle, WM_COMMAND, ...
27K
27 мая 2010 года
snubrik
10 / / 22.07.2007
Цитата: Phodopus
PostMessage((IntPtr)iHandle, WM_COMMAND, ...



Конечно это я делал. Причем в первую очередь я так и написал.
Не работает!

14
27 мая 2010 года
Phodopus
3.3K / / 19.06.2008
Вообще Send, но не суть - должно работать и так.
Отловите Spy++ свойства окна и что приходит в него, пройдитесь дебаггером до параметров SendMessage().
Данный вам способ рабочий.
27K
27 мая 2010 года
snubrik
10 / / 22.07.2007
SPY++ смело виснит при переходе в MESSAGES. =(
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог