WPF: нанесение собственного курсора - нетривиальная проблема
-
12-09-2020 - |
Вопрос
Мне нужно реализовать курсор с некоторыми очень особенными функциями:
- .
- это должно быть анимировано
- .
- потому, что после n секунд он автоматически нажимает - поэтому анимация - обратная связь для пользователя, когда щелчок произойдет
- Это должно привязать к некоторым нашим элементам управления
- Это должно работать за пределами нашего приложения
Подходы пока:
- .
- рендерируйте мой wpf-control в растровое изображение, сделайте курсор-структуру из него и используйте User32.dll / setsystemcursor, чтобы установить его
- .
- pro
- курсор не имеет задержки после мыши, так как это настоящий курсор
- con
- inkappt довольно сложно, тем более, что у нас есть абсолютные и относительные ввода данных, и мне пришлось бы сбросить мыши на вершине все время или использовать user32.dll / clipcursor (system.windows.forms.cursor.clip делает то же самое), но Синхровал курсор всегда встряхнул вокруг нажатой положении (пытается сбежать, снова получить сброс ....)
- Код, который я использую, бросает странные исключения после какого-то случайного времени - поэтому мой текущий код кажется довольно нестабильным
- .
- pro
Чтобы решить второй подход, мой курсор должен иметь хотя бы один прозрачный пиксель В точке доступа, чтобы мышь можно щелкнуть ... это не похоже на реальное решение для меня ...
Любая идея никого?
Редактировать: какой-то пример источника, чтобы показать проблемы ...:
Пример приложения и источника, чтобы показать проблему с щелчкой мыши в фиксированную позицию: CINIT.RAR
Пример приложения и источника, который не удается после случайного времени - установка самозагонного курсора: tryworncur.rar
можно найти под: http://sourcemonk.com/cursor
Решение
Я могу нажать через мой самозагонный курсор, который следует за помощью к положению мыши Установка в стиле окна: нет, а utressTransparent, как я уже сделал и Тогда
public const int WS_EX_TRANSPARENT = 0x00000020;
public const int GWL_EXSTYLE = (-20);
[DllImport("user32.dll")]
public static extern int GetWindowLong(IntPtr hwnd,
int index);
[DllImport("user32.dll")]
public static extern int SetWindowLong(IntPtr hwnd,
int index, int newStyle);
public static void makeTransparent(IntPtr hwnd) {
int extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_TRANSPARENT);
}
.
и позвонить Maketransparent от OnsourceInitializalized ...