Получить слово под курсором мыши в Windows - PullRequest
4 голосов
/ 07 октября 2010

Приветствую всех,

Мы с другом обсуждаем возможность нового проекта: программа перевода, которая будет открывать перевод всякий раз, когда вы наводите курсор мыши на любое слово в любом элементе управления, даже статическом, недоступном для редактированияиз них.Я знаю, что есть много плагинов для браузера, чтобы делать подобные вещи на веб-страницах;мы думаем о том, как бы это сделать в масштабе всей системы (в Windows).

Конечно, основная трудность заключается в том, чтобы выяснить, какое слово пользователь наводит на указатель мыши.Я знаю о MSAA и Automation, но, насколько я могу судить, эти вещи позволяют получить только все содержимое элемента управления, а не конкретное слово, над которым находится мышь.

Я наткнулся на это(проприетарное) приложение, которое делает в точности то, что мы хотим сделать: http://www.gettranslateit.com/

Каким-то образом они могут получить точное слово, которое пользователь наводит на экран практически в любом приложении (кажется, что внесколько приложений, особенно Windows Explorer).Он даже как-то извлекает текст из явно нарисованных элементов управления.Сначала я подумал, что это должно быть использование OCR.Но даже когда я уменьшаю шрифт до такой степени, что текст становится совершенно нечитаемым блобом, он все равно может отлично распознавать слова.(И все же, он ничего не узнает, если я изменю шрифт на Wingdings. Но, может быть, это из-за замысла?)

Есть какие-нибудь идеи относительно того, как достичь этой, казалось бы, невозможной задачи?

РЕДАКТИРОВАТЬ: Он не работает с Wingdings, но работает с некоторыми другими бессмысленными шрифтами, поэтому я подтвердил, что это не может быть OCR.

Ответы [ 2 ]

2 голосов
/ 07 октября 2010

Ну, для элементов управления GDI вы можете получить позицию и размер элемента управления, и вы можете обычно получить информацию о шрифте.Например, при статических текстовых элементах управления вы бы использовали WM_GETFONT .Затем, когда у вас есть это, вы можете получить положение мыши относительно положения элемента управления и использовать одну из функций шрифта , возможно что-то вроде GetTextExtentPoint32 , чтобы выяснить, что находитсякурсорЯ почти уверен, что ответ лежит в этом направлении ...

Вы можете запустить dumpbin /imports в другом приложении и посмотреть, какие API они вызывают.

2 голосов
/ 07 октября 2010

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

...