2012-01-09 4 views
0

Как найти мигающую позицию курсора в окнах, от C++? Во многих случаях мне нужно, чтобы кнопка отправки нажала на позицию мигающего курсора, но я не нашел важной функции, которая позаботится об этом.Программно найти мигающую позицию курсора в окнах C++?

OS выиграть 7 (64), C++

+1

Для меня это мало смысла. Нажатие кнопки происходит с кнопками и не зависит от положения. Кроме того, кнопки не имеют каретки (это название мигающего курсора). Прямой ответ на ваш вопрос заключается в том, что вы просто вызываете 'GetFocus', когда фокус находится в вашем процессе, или' GetGUIThreadInfo', если он находится в другом процессе. Возможно, было бы лучше, если бы вы могли объяснить, какова ваша основная цель. Что мотивирует вопрос? –

+0

Когда я тестирую более одного кода, я часто помещаю этот текстовый код в блокнот ++ и без малейших манипуляций с autohotkey я отправляю ярлык notepad ++, чтобы выделить весь текст и скопировать их в визуальный проект .cpp-файл. После этого auothokey компилирует и запускает этот код. Поэтому я посылаю две команды, чтобы выбрать все, а вторая - копировать. Таким образом, здесь возникает проблема, если вы выберете весь текст, ваш карет станет в верхней части текста. Пункт positionig caret состоит в том, что у вас нет собственного поиска, где вы в последний раз останавливаетесь, если вы сохраните позицию, прежде чем выбирать, что это легко сделать далеко. –

ответ

2

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

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

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

4

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

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

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

+0

По какой-то причине, когда GetForegroundWindow и GetCaretPos всегда получают x и y значение 0, есть ли у вас совет? –

+0

IIRC, GetCaretPos() получает позицию каретки для вызывающего потока (нет HWND или аналогичного параметра); Я не думаю, что вы можете использовать его, чтобы получить позицию каретки из другого потока или приложения; может использовать GetGUIThreadInfo для этого случая. – BrendanMcK

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

  • Нет связанных вопросов^_^