2014-08-28 6 views
0

Недавно я искал в Интернете решения с несколькими курсорами и нашел множество возможностей подражать курсорам в данном окне, например MultiPoint SDK, но нет решений, в которых можно использовать несколько курсоров на всем рабочем столе (и, таким образом, не ограничиваясь одним приложением).Как он мог работать с несколькими курсорами на одном клиенте Windows?

Я почти сдался, думая, что архитектура Windows делает невозможным, но затем я нашел MultiMouse, заявив в своем видеоролике в this видео на YouTube, что по крайней мере позволит использовать разные курсоры для разных пользователей на всем рабочем столе. Если это так, то следует, что можно эмулировать несколько пользователей и тем самым сделать возможным решение нескольких курсоров.

Так что мои вопросы:

  • ли кто-то здесь используют мультиМаус и это действительно работает, как описано?
  • Как это работает, может ли кто-то использовать windows api или нужно перенастроить Windows для этого?
  • Есть ли у вас идеи о том, как рисовать и управлять несколькими курсорами в Windows 7? Проблема в том, что есть только один указатель мыши. Может кто-то изменить это, или что делают удаленные приложения? Я имею в виду, достаточно было бы просто показать курсоры (глобально) и автоматически контролировать их.
  • Я могу использовать любые методы взаимодействия, как бы они ни были грязными, поскольку достаточно, чтобы мое приложение запускалось только в Windows 7. Кто-нибудь знает библиотеки Windows, которые могут предоставить такую ​​функциональность? К сожалению, окна api плохо документированы.

Edit: Ниже я объясню, как окна сообщения частично работать, но почему они не делают вообще. Во-первых, в качестве примера мы используем флеш-клиент, который представляет собой дескриптор с дочерним элементом, а его дочерний объект является флеш-объектом. Всякий раз, когда щелчок производится в любом месте в области флэш-памяти, следующие окна сообщения отображаются:

< 000001> 00100354 S WM_PARENTNOTIFY fwEvent: WM_LBUTTON XPOS: [х] YPos: [у]

< 000002> 00100354 R WM_PARENTNOTIFY

< 000003> 001B09D6 S WM_MOUSEACTIVATE hwndTopLevel: 00100354 nHittest: HTCLIENT uMsg: WM_LBUTTONDOWN

< 000004> 00100354 S WM_MOUSEACTIVATE hwndTopLevel: 0 0100354 nHittest: HTCLIENT uMsg: WM_LBUTTONDOWN

< 000005> 00100354 R WM_MOUSEACTIVATE fuActivate: MA_ACTIVATE

< 000006> 001B09D6 R WM_MOUSEACTIVATE fuActivate: MA_ACTIVATE

< 000007> 001B09D6 Р WM_LBUTTONDOWN fwKeys: MK_LBUTTON XPOS: [х ] YPOS: [Y]

< 000008> 001B09D6 Р WM_LBUTTONUP fwKeys: 0000 XPOS: [х] YPOS: [у]

В этом примере 00100354 является родителем, а 001B09D6 является дочерним объектом (флэш-объектом). Так получилось, что родитель говорит ребенку щелкнуть в определенной позиции ([x], [y]).Но решение поддельного клика, работающее с сообщениями Windows, никогда не может знать, какой дескриптор он должен щелкнуть. Если клики или уведомления отправляются только на 00100354, ничего не происходит. То, что мы пытаемся выполнить, это сообщения < 000007> и < 000008>, но мы не можем, за исключением сообщений о спаме всем потомкам дескриптора переднего плана, включая сам дескриптор переднего плана. Но это также может привести к кликам, которые нам не нужны. Мы не можем выполнить тест на попадание, поскольку целевое приложение может иметь, например, прозрачные ручки перед целевым дескриптором. Обратите внимание, что необходимо также вычислить новые относительные координаты, если дочерний дескриптор не расположен в (0,0) его родителя.

Для реализации связи, как показано выше, можно использовать Win32 вызовы, например:

[DllImport("User32.dll", SetLastError = true)] 
public static extern IntPtr SendMessage(IntPtr hWnd, WM Msg, IntPtr wParam, IntPtr lParam); 

[return: MarshalAs(UnmanagedType.Bool)] 
[DllImport("user32.dll", SetLastError = true)] 
public static extern bool PostMessage(IntPtr hWnd, WM Msg, IntPtr wParam, IntPtr lParam); 

[...]

public static IntPtr ToWMCoords(Point pt) 
{ 
    return (IntPtr)(((uint)pt.Y << 16) | (ushort)pt.X); 
} 

[...]

foreach (Point pt in coordinates) 
{ 
     Console.Write("Message-Clicking at " + pt + "\n"); 
     IntPtr mousePos = ToWMCoords(pt); 

     //# Get flash handle 
     //## Variation, assuming the client has always only 1 child with class name "MacromediaFlashPlayerActiveX" 
     IntPtr flashHwnd = Interop.GetChildWindows(hwnd).Where(x => Interop.GetClassNameOfHandle(x) == "MacromediaFlashPlayerActiveX").Single(); 

     //# Simulating a click 
     //*1: Messages getting to handle of class "#32770 (Dialog)" 
     //*2: Messages getting to handle of class "MacromediaFlashPlayerActiveX" 

     Interop.User32.SendMessage(hwnd, Interop.WM.PARENTNOTIFY, (IntPtr)0x201, mousePos);//*1 
     Interop.User32.SendMessage(flashHwnd, Interop.WM.MOUSEACTIVATE, hWnd, (IntPtr)0x2010001);//*2 
     Interop.User32.SendMessage(hwnd, Interop.WM.MOUSEACTIVATE, hWnd, (IntPtr)0x2010001);//*1 
     bool lBtnDown = Interop.User32.PostMessage(flashHwnd, Interop.WM.LBUTTONDOWN, (IntPtr)Interop.MK.LBUTTON, mousePos);//*2 
     bool lBtnUp = Interop.User32.PostMessage(flashHwnd, Interop.WM.LBUTTONUP, IntPtr.Zero, mousePos);//*2 
     Console.Write("WM_LBUTTONDOWN " + (lBtnDown ? "success" : "fail") + ", WM_LBUTTONUP " + (lBtnDown ? "success" : "fail") + "\n"); 
    } 

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

+1

После прочтения руководства по мультимусу - ** учтите, что я не использовал фактический продукт ** - я пришел к сильному подозрению, что он только подделывает дополнительные курсоры, используя одну из тех методик, которые я описал в своем [ответе ] (http://stackoverflow.com/a/25550951/2144232). Но в очередной раз это просто подозрение. – mg30rg

+0

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

+0

Я думаю, что идея в целом неплохая, но я бы использовал какой-то другой инструмент, так как я не уверен, что MsPaint использует [многоточечные SDK-элементы управления] (http://msdn.microsoft.com/en-us/library/ windows/desktop/ee906605.aspx), который мог бы обрабатывать несколько входов мыши, но не имеет для вас никакого смысла, поскольку их область применения - это приложение, в которое они встроены (и они довольно дрянные даже там: встроенные элементы управления, такие как полосы прокрутки текстовых полей, не Работа). – mg30rg

ответ

0

Если вы ищете решение иметь указатель подобного объекта, который перемещается вокруг на рабочем столе, я мог бы иметь идею для «грязного» решения, но я хочу предупредить вас, что это должен быть ваш последний выбор. Это действительно грязно и плохо информировано. (Я сделал что-то вроде этого, когда я был новичком в реальном, и я никогда не сделал бы это снова.)


Так вот сделка:

Вы можете создать верхнюю маленькую форму, которая является указателем мыши -образный. Затем он может программно перемещаться по экрану. Клики/doubleclicks/hovering могут быть эмулированы посредством доступности или через сообщения Windows (оба решения имеют свои собственные кавычки, поэтому выбирайте с умом).

Доступность предоставляет несколько стандартизованный способ доступа к формам и элементам управления и будет рекомендуемым решением, но есть проблема: не все программы Windows поддерживают доступность (особенно старые программы и игры), поэтому некоторые из них не будут реагировать на поддельный указатель.

Сообщения Windows - это неуправляемый способ Win32, если вы хотите что-то подобное. В этом случае вы можете отправлять сообщения мыши (WM_CAPTURECHANGED WM_LBUTTONDBLCLK WM_LBUTTONDOWN WM_LBUTTONUP WM_MBUTTONDOWN WM_MBUTTONUP WM_MOUSEMOVE WM_MOUSEWHEEL WM_RBUTTONDOWN WM_RBUTTONUP) к форме под вашим фальшивым курсором. Это решение имеет caveeat, что вы должны использовать API-интерфейс без управления Postmessage.


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

+0

Но на самом деле ... делайте это только в том случае, если другого решения нет. Я не знаю, поддерживает ли Windows несколько курсоров, и мое решение помогает только подделывать. – mg30rg

+0

Спасибо за ответ, но это не то, что я искал. Это довольно тривиальное поддельное решение, которое я пытаюсь избежать, задавая этот вопрос. Есть еще больше проблем с этим решением, например, сообщения Windows не могут имитировать вход Windows, как описано [здесь] (http://blogs.msdn.com/b/oldnewthing/archive/2011/07/28/10190521.aspx) , – xamid

+0

@xamid - Вот почему я посоветовал использовать любое другое решение, если оно есть. ** (Насколько я знаю, нет.) ** Также статья Old New Thing, которую вы связали, упоминает только ввод символов, и это по какой-то причине. Большинство приложений обрабатывают события мыши через сообщения Windows, поэтому могут работать с моим решением. Это довольно распространенная практика, позволяющая напрямую обрабатывать ввод с клавиатуры, но не так часто, чтобы напрямую обращаться с мышью. – mg30rg

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

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