Найти дескриптор окна кнопки ленты - PullRequest
2 голосов
/ 04 января 2011

Я пытаюсь сделать некоторую автоматизацию приложений Windows. Чтобы делать все, что я хочу, мне нужны оконные дескрипторы некоторых элементов управления.

Раньше я выполнял это с помощью комбинации EnumWindows, EnumChildWindows и GetWindowText. Но теперь у некоторых более новых программ больше нет панели инструментов с кнопками. Вместо этого у них есть лента.

Сначала это не казалось мне большой проблемой, но теперь я замечаю, что кнопки на ленте не отображаются в EnumChildWindows! Или, по крайней мере, GetWindowText не возвращает тот же текст, который отображается на экране.

Итак, коротко: Кто-нибудь может сказать мне, как я могу программно найти ручку кнопки на ленте?

Спасибо. С Уважением, LDX

Ответы [ 5 ]

2 голосов
/ 04 января 2011

Проще говоря, я не думаю, что вы можете. Все больше и больше приложений Windows используют каркасы GUI, которые не отображают элементы управления с дискретными дочерними окнами. Фреймворк ленточного интерфейса кажется одним из них.

Единственный способ перечислить элементы управления в приложении, которое не использует дочерние окна, - это использовать специальные API: Windows Automation API: UI Automation является отправной точкой в ​​документации.

1 голос
/ 10 января 2011

Хорошо,

Так что действительно было невозможно получить ручку для этих кнопок. Я решил это с помощью SendKeys для отправки сочетания клавиш, которое активирует кнопку. В моем случае это была кнопка сохранения, поэтому я использовал

  INPUT inputs[4];
  // press control
  inputs[0].type = INPUT_KEYBOARD;
  inputs[0].ki.wVk = 0x11; // "VK_Control"      
  inputs[0].ki.wScan = 0;
  inputs[0].ki.dwFlags = 0;
  inputs[0].ki.time = 0;
  inputs[0].ki.dwExtraInfo = 0;      

  // press "s"
  inputs[1].type = INPUT_KEYBOARD;
  inputs[1].ki.wVk = 0x53;  // "s"
  inputs[1].ki.wScan = 0;
  inputs[1].ki.dwFlags = 0;
  inputs[1].ki.time = 0;
  inputs[1].ki.dwExtraInfo = 0;      

  // release "s"
  inputs[2].type = INPUT_KEYBOARD;
  inputs[2].ki.wVk = 0x53;  // "s"
  inputs[2].ki.wScan = 0;
  inputs[2].ki.dwFlags = KEYEVENTF_KEYUP;
  inputs[2].ki.time = 0;
  inputs[2].ki.dwExtraInfo = 0;      

  // release control
  inputs[3].type = INPUT_KEYBOARD;
  inputs[3].ki.wVk = 0x11; // "VK_Control"      
  inputs[3].ki.wScan = 0;
  inputs[3].ki.dwFlags = KEYEVENTF_KEYUP;
  inputs[3].ki.time = 0;
  inputs[3].ki.dwExtraInfo = 0;      

  return SendInput(8, inputs, sizeof(INPUT)) == 8;

Может быть, это может породить идеи для других людей с такой же проблемой :)

Gr, LDX

1 голос
/ 04 января 2011

Используйте Spy ++, поставляемый с Visual Studio (или любым другим подобным инструментом), чтобы увидеть, действительно ли эти кнопки являются окнами. Если да, посмотрите подробную информацию о них с помощью этого инструмента. Однако весьма вероятно, что это приложение рисует их самостоятельно в контексте родительского окна, и в этом случае вы не можете получить дескриптор окна, потому что они не являются реальными окнами.

0 голосов
/ 04 января 2011

может быть это может дать какое-то руководство? http://msgroups.net/microsoft.public.excel.programming/Get-a-specifc-button-Handle-inside-ribbon

0 голосов
/ 04 января 2011

Вы можете иметь дескриптор окна, которое вы называете лентой.Но у вас не может быть ручки для того, что вы называете кнопкой.

Логически: что вы называете ручкой?ты хочешь HWND?Если вы хотите HWND, тогда вам нужно окно ... но единственное окно, которое у вас есть, это лента.

Это называется программированием без окон.

Однако вы можете использовать компонент технологии COM: интерфейс COM IAccesible .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...