2013-09-18 2 views
0

Мне нужно сделать небольшое приложение для системного лотка, которое отслеживает положение курсора по всей стране и отображает или скрывает экранную клавиатуру в зависимости от идентификатора дескриптора курсора. если курсор находится в текстовом поле (позиция равна IBeam) в IE, например, клавиатура всплывает. У меня есть код для приложения в системном трее (без формального приложения), но не удается найти способ его отслеживания. Любая помощь с функцией мониторинга системы для позиции курсора приветствуется. Благодарю.Монитор Cursor Position system wide

+0

Это можно легко сделать с помощью стандартного 'TextBox', но это не так просто с какой-то скомпонованы' TextBox', такие как '' TextBox' в WPF'. –

+0

Просто используйте Cursor.Position в обработчике событий Tick Tick. –

+0

образец кода, пожалуйста? –

ответ

0

Чтобы управлять событиями, вам необходимо использовать SetWindowsHookEx. Вы не можете сделать это напрямую через .NET, но должны ввести DLL. Вот MSDN article on making a mouse hook. Это делается с помощью System.Runtime.InteropServices для импорта user32.dll. В статье MSDN приведены пошаговые инструкции по вызову SetWindowsHookEx, CallNextHookEx и UnhookWindowsHookEx из C#. CodeProject также имеет статью о making system-wide hooks in .NET.

+0

Не видите, как получить курсор управления IBeam с помощью мыши! –

+0

Я не думаю, что вы хотите взглянуть на дескриптор курсора, но скорее сделайте тест на попадание мыши. Посмотрите на это [SO post about WindowFromPoint] (http://stackoverflow.com/questions/3901183/how-can-i-tell-if-the-mouse-is-over-a-top-level-window). – jltrem

+0

нашел парня, ищущего то же самое в C++. Кто-нибудь, чтобы преобразовать код в C#? Я использовал конвертер, но не уверен, что он выполняет все необходимые преобразования: LRESULT CALLBACK winProc (int nCode, WPARAM wParam, LPARAM lParam) { if (nCode <0) return CallNextHookEx (hhk, nCode, wParam, lParam) ; if (lParam) { CWPSTRUCT * msg = (CWPSTRUCT *) lParam; if ((msg-> message == WM_COMMAND) && (HIWORD (msg-> wParam) == EN_SETFOCUS)) MessageBox (NULL, «focus!», «Information», MB_ICONINFORMATION); } return CallNextHookEx (hhk, nCode, wParam, lParam); } –

0

Контролировать позиции системного курсора:

  private void Pos() 
      { 
       for (; ;) 
       { 
        Thread.Sleep(10); 
        Point position = Cursor.Position; 
//You can use these to pass to your system tray or whereever you need it. 
        somePublicXVar = position.X; 
        somePublicYVar = position.Y; 
       } 

      } 
      public void PointPosition() 
      { 
       Thread pointThread = new Thread(new ThreadStart(Pos)); 
       pointThread.Start(); 
      } 
+0

В петле много CPU! –

+0

В зависимости от ваших потребностей вы должны попробовать использовать большее число для Thread.Sleep (MinMilisecondsYouCanAfford). Надеюсь, поможет. – Regu

+0

Потребность: всякий раз, когда мой курсор помещается в учебнике в любом приложении, экранная клавиатура может появиться как на планшетах. Windows Metro отлично работает, но в настольном режиме эта функция отсутствует. –

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