2011-01-04 3 views
2

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

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

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

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

Спасибо. С уважением, ldx

ответ

0

Хорошо,

Так это было на самом деле не представляется возможным получить ручку на эти кнопки. Я решил это, используя 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

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

2

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

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

0

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

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

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

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

Смежные вопросы