Что такое код getcursorpos


GetCursorPos возвращает только значение x

Я видел поток на форуме MSDN, где возникла проблема с 32-битными и 64-битными целыми числами. Я не уверен, что это моя проблема, но кажется, что этот код должен работать, поэтому я немного смущен.

Я запускаю VB6 в режиме совместимости (XP SP2) в 64-разрядной версии Windows 7.

В этом окне сообщения отображается правильное значение для координаты x мыши, но оно показывает «0» для y , независимо от того, где находится мышь на экране. Кроме того, GetCursorPos() возвращает 1 .

В VB6 тип данных Integer — это 16-разрядное число. Вы должны использовать Long, поскольку это 32-разрядное число.

Если вы работаете в VB6, ваша декларация POINTAPI должна использовать Long для вашего объявления точки:

Что касается возврата 1, это означает, что вы были успешны:

Возвращаемое значение Long — NonZero при успешном завершении, ноль при ошибке. Устанавливает GetLastError

«От руководства программиста на Visual Basic к API Win32»

GetCursorPos работает нормально, но GetPhysicalCursorPos & quot; не объявлено в этой области & quot ;?

Я пишу некоторый код (в Codelite), использовал GetCursorPos (), нет проблем. Но когда я хочу вызвать GetPhysicalCursorPos (), он говорит, что он не объявлен в этой области …

То же самое с SetCursorPos работает нормально, но не SetPhysicalCursorPos …

Они оба должны работать нормально, так как я включил windows.h, не знаю, что делать …

Я пытался импортировать его из user32.dll, но так не должно быть …

Спасибо за помощь.

Решение

GetPhysicalCursorPos API был добавлен только в Vista / Server 2008. Так что вам нужно определить

прежде чем включить заголовочный файл Windows. Больше информации об этом можно найти в теме MSDN: Использование заголовков Windows .

Другая возможность состоит в том, что ваши заголовочные файлы устарели. Возможно, используемый вами компилятор не поставляется с обновленным SDK. Если это так, то вы можете попробовать более позднюю версию компилятора, другой компилятор или даже официальный поставляемый MS SDK.

Вы должны знать, что зависимость от этого API будет означать, что ваша программа не будет работать в XP.

SetCursorPos и ​​GetCursorPos не работает на экране входа в систему?

При попытке использовать SetCursorPos на экране входа в Windows Vista / 7, true возвращаются который в первом заставил меня думать , что работали. Однако, когда я называю GetCursorPos это дает мне:

Любые мысли, почему? Является ли это «функция безопасности» или я использую это неправильно? Код работает отлично на нерегистрированном (т.е. нормальный) рабочего столом.

На экране входа в систему и в окне безопасности вы не можете отправить события мыши или клавиатуры. Это мера безопасности для Windows, в целях предотвращения несанкционированного доступа из различных программ.

Входной рабочий стол должен быть текущим рабочим столом, когда вы звоните GetCursorPos. Вызов OpenInputDesktop для определения текущего рабочего стола, является ли входной рабочий стол. Если это не так, вызовите SetThreadDesktop с HDESK возвращенного OpenInputDesktop, чтобы переключиться на рабочий стол.

Эта страница (где я получил вышеупомянутую цитату из) , который задает вопрос «GetCursorPos не работает , если рабочий стол заблокирован», имеет следующую информацию:

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

В этот момент, вы должны подключить в O / S (люди сделали это, заменив GINA.dll, но вы не можете сделать это в управляемом коде, и на вершине, что вы не можете сделать это в перспективе , так как она имеет другую модель).

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

Что такое код getcursorpos

I am getting the value only in my one textbox of x-axis when I try to get both the coordinates here is my code in vb vs 2008

Structure POINTAPI ‘ This holds the logical cursor information

‘Private Declare Function SetCursorPos Lib «user32» (ByVal x As Long, ByVal y As Long) As Long

Private Declare Function GetCursorPos Lib «user32» (ByRef point As POINTAPI) As Long

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

Dim rect As POINTAPI

‘ Get the current mouse cursor coordinates:

‘ Print out current position on the form:

Answers

Your api calls are incorrect. In C the point is declared with x and y being 32 bit integers. In vb6 you use Long as this is a 32 bit integer. In .Net a Long is a 64 bit integer — too big. The C function will shove all 64 bits that make up x and y into x making it return nonsense. In .Net you should use Integer for x and y.

SetCursorPos and GetCursorPos should return Boolean, not Long. C expects BOOL which is a 32 bit value, so Long is good in vb6, in .Net Boolean is a better match.

GetCursorPos

Функция GetCursorPos извлекает положение курсора в экранных координатах.

BOOL GetCursorPos (

LPPOINT lpPoint // адрес структуры для положения курсора

Параметры

lpPoint — указывает на структуру типа POINT , которая получает экранные координаты курсора.

Возвращаемые значения

В случае успеха возвращается ненулевое значение.

В случае неудачи возвращается нуль. Для получения дополнительной информации об ошибке вызовите функцию GetLastError .

Комментарии

Положение курсора всегда дается в экранных координатах и не подвержено воздействию режима отображения окна, которое содержит курсор.

Вызывающий процесс должен иметь доступ WINSTA _ READATTRIBUTES к оконной станции ( window station ). Разъяснение термина window station смотрите в описании функции CreateWindowStation .

См. также

ClipCursor, POINT, SetCursor, SetCursorPos, ShowCursor .

c++ — GetCursorPos и привилегии

У меня есть метод получения позиции курсора и получения координат в определенном окне с помощью GetCursorPos() и ScreenToClient(). Все это прекрасно работает, кроме странной вещи.

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

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

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

Проблема найдена (не решена): причиной является «Изоляция привилегий пользовательского интерфейса (UIPI)»

Объяснить ошибки из GetKeyState / GetCursorPos

Иногда я получаю сообщения об ошибках от клиентов, которые я не могу объяснить. После Application.Run () в Delphi я получаю следующие ошибки:

В обоих случаях скриншот, представленный Eurekalog, полностью черный.

Кто-нибудь может объяснить, что может вызвать сбой GetCursorPos или GetKeyState таким образом?

3 ответа

Документация для GetCursorPos гласит:

Рабочий стол ввода должен быть текущим рабочим столом при вызове GetCursorPos. Вызовите OpenInputDesktop, чтобы определить, является ли текущий рабочий стол входным рабочим столом. Если это не так, вызовите SetThreadDesktop с HDESK, возвращенным OpenInputDesktop, чтобы переключиться на этот рабочий стол.

Вы можете не справиться с этим, чаще всего при разблокировке рабочей станции. В моем коде я заменяю GetCursorPos на этот вариант:

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

с RedirectProcedure как описано здесь: исправление вызова процедуры в delphi

Для моего конкретного сценария оказалось, что GetCursorPos потерпит неудачу, но GetCursorInfo не потерпит неудачу. Но, как уже отмечалось в комментариях, есть сценарии, в которых GetCursorInfo также не работает. В этом случае может оказаться целесообразным установить, что исправленная функция не возвращает False .

Что касается GetKeyState , я не уверен в этом. Это вполне возможно, но GetKeyState — это API, с которым я лично не знаком.

Поясните ошибки из GetKeyState / GetCursorPos

Иногда я получаю сообщения об ошибках от клиентов, которые я не могу объяснить. После Application.Run () в Delphi я получаю следующие ошибки:

В обоих случаях скриншот, представленный от EurekaLog полностью черный.

Может кто-нибудь объяснить, что может привести к GetCursorPos или GetKeyState потерпеть неудачу таким образом?

В документации GetCursorPos сказано:

Входной рабочий стол должен быть текущим рабочим столом, когда вы звоните GetCursorPos. Вызов OpenInputDesktop для определения текущего рабочего стола, является ли входной рабочий стол. Если это не так, вызовите SetThreadDesktop с HDESK возвращенного OpenInputDesktop, чтобы переключиться на рабочий стол.

Вы можете ссориться это, чаще всего при разблокировании рабочей станции. В моем коде я заменить GetCursorPos этот вариант:

Вы можете использовать свой любимый механизм код крепежного заменить GetCursorPos . Я делаю это так:

с , RedirectProcedure как описано здесь: Патч вызова подпрограммы в Дельфах

Оказалось, для моего конкретного сценария, что GetCursorPos провалится, но GetCursorInfo не потерпит неудачу. Но , как было отмечено в комментариях, есть сценарии , где GetCursorInfo также утратит. В этом случае вы могли бы найти целесообразным организовать что исправленная функция не возвращает False .

Что же касается GetKeyState , я не уверен , что один. Это вполне возможно , похожи , но GetKeyState есть API , что я лично не знаком.

Explain errors from GetKeyState / GetCursorPos

Sometimes I get bug reports from customers, that I can’t explain. After Application.Run() in Delphi I get the following errors:

In both cases the screenshot submitted from Eurekalog is completely black.

Can anybody explain, what can cause GetCursorPos or GetKeyState to fail this way?

3 Answers 3

The documentation for GetCursorPos says:

The input desktop must be the current desktop when you call GetCursorPos. Call OpenInputDesktop to determine whether the current desktop is the input desktop. If it is not, call SetThreadDesktop with the HDESK returned by OpenInputDesktop to switch to that desktop.

You can fall foul of this, most commonly when unlocking a workstation. In my code I replace GetCursorPos with this variant:

You can use your favourite code hooking mechanism to replace GetCursorPos . I do it like so:

with RedirectProcedure as described here: Patch routine call in delphi

It turned out for my particular scenario, that GetCursorPos would fail, but GetCursorInfo would not fail. But as has been pointed out in the comments, there are scenarios where GetCursorInfo will also fail. In that case you might find it expedient to arrange that the patched function does not return False .

As for GetKeyState , I’m not sure about that one. It’s quite possibly similar but GetKeyState is an API that I am not personally familiar with.

Что может сделать GetCursorPos возвращать неверные координаты <0,0>?

Мы видим, что плохое поведение в приложении, когда он работает на сервере 2008 (не R2). Это приложение WinForms, и Control.MousePosition возвращается <0,0>, независимо от того, где мышь находится на экране. Control.MousePosition просто делает P/Invoke вызов Win32 API GetCursorPos().

Я использую Control.MousePosition из WinForms, который вызывает GetCursorPos, и я могу видеть, что он определенно игнорирует возвращаемое значение. Просить мой вопрос иначе, «Что может вызвать GetCursorPos(), чтобы внезапно начать возвращать FALSE, когда он работал в течение нескольких миллисекунд до этого в том же процессе?»

Существует управление в нашей библиотеке, которая вызывает SetWindowsHookEx зацепить WH_CALLWNDPROCRET для всего нашего процесса. Я с подозрением отношусь к этому коду, но трассировка заявление показывает, что мы получаем в + из этого крючка чисто.

Что еще я должен искать?

3 ответа

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

Оказывается, что это может произойти с/LARGEADDRESSAWARE 32 разрядных приложений, работающих на 64-битном сервере 2008 R1 только.

Для того, чтобы выяснить, в чем проблема, вы должны добавить некоторую проверку ошибок. Если GetCursorPos возвращается false , вызов GetLastError , А затем выбросить полученное значение в качестве исключения.

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

Вы пробовали Cursor.Position? (MSDN Link)

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

Илон Маск рекомендует:  Вместо печати графики я хочу использовать резидентный шрифт принтера как
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL