Программно найти положение курсора мигания в Windows C ++? - PullRequest
0 голосов
/ 09 января 2012

Как узнать положение мигающего курсора в windows, из c ++? Во многих случаях мне нужно нажать кнопку «Отправить» в положении мигающего курсора, но я не нашел ни одной важной функции, которая позаботится об этом.

ОС win 7 (64), c ++

Ответы [ 2 ]

4 голосов
/ 09 января 2012

Называется "каретка", курсор - указатель мыши. Вы используете GetCaretPos (), чтобы получить его позицию. Но возвращаемая позиция относительно клиентской области окна, которому принадлежит каретка. Что, вероятно, означает, что вам нужно сначала найти это окно, для этого используйте GetForegroundWindow (). И не отправляйте сообщения о нажатии кнопки, они публикуются, поэтому используйте PostMessage ().

Избегайте всего этого, просто используя SendInput ().

Обратите внимание, что UIPI (компонент пользовательского интерфейса UAC) не позволяет вам совать вещи в окно, принадлежащее повышенному процессу.

2 голосов
/ 10 января 2012

GetGUIThreadInfo () , вероятно, ваш лучший выбор; передайте его с idThread = 0, чтобы получить информацию из текущего активного потока, а затем проверьте член rcCaret возвращенной структуры GUITHREADINFO. Затем вам нужно будет использовать ClientToScreen () со значением hwndCaret для преобразования относительных к клиенту координат в экранные координаты.

Обратите внимание, что это работает только для приложений, которые используют функции каретки Win32 - в частности, SetCaretPos (). Если приложение рисует свою собственную карету, не используя их, вы можете не получить ничего значимого в ответ. (Некоторые приложения, такие как Word, рисуют свою собственную карету, но все еще вызывают SetCaretPos, чтобы вспомогательные средства, которые должны отслеживать каретку, могли использовать эту технику.)

Прямоугольник, который вы получаете назад, иногда может быть шире, чем фактическая каретка. Когда для каретки используется растровое изображение, как в случае кареток справа налево или слева направо, с небольшим «флагом», прикрепленным к вершине, вы получите прямоугольник, который немного шире, чем фактическая область каретки, и, возможно, потребуется скорректировать или иным образом выяснить, где в этой области находится фактическая планка каретки - она ​​может быть или не быть точно посередине. Похоже, что для Notepad ++ все должно быть в порядке.

...