Недавно я искал в Интернете решения с несколькими курсорами и нашел множество возможностей подражать курсорам в данном окне, например 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");
}
Таким образом, подделка ввода с использованием оконных сообщений кажется неправильной или невозможной, в зависимости от целевого приложения.
После прочтения руководства по мультимусу - ** учтите, что я не использовал фактический продукт ** - я пришел к сильному подозрению, что он только подделывает дополнительные курсоры, используя одну из тех методик, которые я описал в своем [ответе ] (http://stackoverflow.com/a/25550951/2144232). Но в очередной раз это просто подозрение. – mg30rg
Я также начал думать, что :(Но это сделает их инструмент довольно дрянным. Я считаю, что хороший способ проверить, что будет, использовать инструмент рисования в виде mspaint и рисовать там более чем одним курсором за раз. ,инструмент не подделка, если он работает (даже если mspaint действует странно из-за большого количества входной информации). Если он работает только с одним пользовательским рисунком, возможно, реальный курсор будет использоваться всякий раз, когда один пользователь выполняет действие. Если он никогда не работает, все это большая подделка, используя просто окна сообщений. – xamid
Я думаю, что идея в целом неплохая, но я бы использовал какой-то другой инструмент, так как я не уверен, что MsPaint использует [многоточечные SDK-элементы управления] (http://msdn.microsoft.com/en-us/library/ windows/desktop/ee906605.aspx), который мог бы обрабатывать несколько входов мыши, но не имеет для вас никакого смысла, поскольку их область применения - это приложение, в которое они встроены (и они довольно дрянные даже там: встроенные элементы управления, такие как полосы прокрутки текстовых полей, не Работа). – mg30rg