«Скрывающий» системный курсор

BACKGROUND: I'm trying to create a "mouse hiding" application that hides the user's mouse from the screen after a set amount of time. I've tried many things, and using SetCursor only hides the mouse from the current application, mine must be able to sit in the tray (for example) and still function. I think I've found a solution with SetSystemCursor except for one problem. MY PROBLEM: I need to be able to capture any kind of mouse cursor, and replace the exact same kind of mouse cursor. When replacing the mouse, I need to provide the id of the type of mouse I'd like to replace with the mouse referenced by the handle, but none of the functions I'm using provide me with the copied mouse's id (or type). MY QUESTION: Would it be sufficient to continue doing it this way, but move the mouse to 0,0 first, hiding it, and moving it back to it's original location upon un-hiding? (Unhiding is accomplished by simply moving the mouse) Would a mouse at 0,0 always be an OCR_NORMAL mouse? (The standard arrow.) If not, how could the mouse type/id be found to enable me to replace the proper mouse with the proper handle? SOURCE:
<code>[DllImport("user32.dll")]
public static extern IntPtr LoadCursorFromFile(string lpFileName);
[DllImport("user32.dll")]
public static extern bool SetSystemCursor(IntPtr hcur, uint id);
[DllImport("user32.dll")]
static extern bool GetCursorInfo(out CURSORINFO pci);

[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
public Int32 x;
public Int32 y;
}

[StructLayout(LayoutKind.Sequential)]
struct CURSORINFO
{
public Int32 cbSize;        // Specifies the size, in bytes, of the structure. 
// The caller must set this to Marshal.SizeOf(typeof(CURSORINFO)).
public Int32 flags;         // Specifies the cursor state. This parameter can be one of the following values:
//    0             The cursor is hidden.
//    CURSOR_SHOWING    The cursor is showing.
public IntPtr hCursor;          // Handle to the cursor. 
public POINT ptScreenPos;       // A POINT structure that receives the screen coordinates of the cursor. 
}

private POINT cursorPosition;
private IntPtr cursorHandle;
private bool mouseVisible = false;
private const uint OCR_NORMAL = 32512;

//Get the current mouse, so we can replace it once we want to show the mouse again.
CURSORINFO pci;
pci.cbSize = Marshal.SizeOf(typeof(CURSORINFO));
GetCursorInfo(out pci);
cursorPosition = pci.ptScreenPos;
cursorHandle = CopyIcon(pci.hCursor);

//Overwrite the current normal cursor with a blank cursor to "hide" it.
IntPtr cursor = LoadCursorFromFile(@"./Resources/Cursors/blank.cur");
SetSystemCursor(cursor, OCR_NORMAL);
mouseVisible = false;

//PROCESSING...

//Show the mouse with the mouse handle we copied earlier.
bool retval = SetSystemCursor(cursorHandle, OCR_NORMAL);
mouseVisible = true;
</code>
 Raymond Chen10 мая 2012 г., 22:14
Если бы две программы делали это, то одна автоматически скрывала курсор и помнила, что раньше он был стрелкой. Затем второй автоматически скрывает курсор и запоминает, что раньше он был пустым. Затем первый переставил курсор и восстановил стрелку. Затем второй перезапустит курсор и восстановит пробел. Результат: курсор навсегда потерян. Если вы хотите обеспечить такое поведение в своем приложении, то установите для своего приложения пустой курсор в егоWM_SETCURSOR обработчик, когда думает, что должен скрыться автоматически.
 DTI-Matt10 мая 2012 г., 21:56
Затем он просто сбросит таймер другого приложения. Я пытаюсь воссоздатьэт по существу. На компьютере, на котором будет развернуто это приложение, будет работать только наше программное обеспечение. Мы просто хотели бы включить эту функцию непосредственно в наше программное обеспечение, а не полагаться на стороннее приложение.
 Raymond Chen10 мая 2012 г., 21:51
Представьте, если бы два приложения делали это.

Ответы на вопрос(2)

Решение Вопроса

о вам нужно написать какой-нибудь драйвер мыши.

 Peter Ritchie10 мая 2012 г., 22:21
Правильно, сброс исходного курсора влияет на курсор другого приложения.
 DTI-Matt10 мая 2012 г., 21:43
Но я могу скрыть курсор, эта часть не проблема. проблема сброса исходного курсора. (Я прячу системный курсор. Не курсор другого приложения.)

ра, который не включает в себя шумиху сsetsystemcursor().

SetSystemCursor() опасно, потому что если приложение вылетает или иным образом выдает ошибку, курсор будет изменен навсегда до следующей перезагрузки.

Вместо этого я установил прозрачное окно на весь рабочий стол, и это окно при необходимости скрывает курсор. Используемый метод - ShowCursor из Win32.

Прозрачное окно может выглядеть примерно так:http: //www.codeproject.com/Articles/12597/OSD-window-with-animation-effect-in-

[DllImport("user32.dll")]
static extern int ShowCursor(bool bShow);

ShowCursor(false);
 Jashengmato16 янв. 2018 г., 05:33
Не работает, приятель, HideCursor скрывает, только если окно интерактивно, а плавающее окно OSD - нет.

Ваш ответ на вопрос