“隐藏”系统光标

时间:2012-05-10 19:38:31

标签: c# winapi mouse

背景:

  • 我正在尝试创建一个“鼠标隐藏”应用程序,该应用程序会在一段时间后将用户的鼠标从屏幕上隐藏。
  • 我尝试了很多东西,使用SetCursor只隐藏了当前应用程序中的鼠标,我必须能够坐在托盘中(例如)并且仍能正常运行。
  • 我认为除了一个问题外,我找到了一个SetSystemCursor的解决方案。

我的问题:

  • 我需要能够捕获任何类型的鼠标光标,并替换完全相同类型的鼠标光标。
  • 当更换鼠标时,我需要提供我想用手柄引用的鼠标替换的鼠标类型的id,但是我使用的所有函数都没有为我提供复制鼠标的id(或类型)。

我的问题:

  • 以这种方式继续这样做是否足够,但是先将鼠标移动到0,0,隐藏它,并在取消隐藏时将其移回原来的位置? (取消隐藏只需移动鼠标即可实现)
  • 0,0的鼠标是否总是OCR_NORMAL鼠标? (标准箭头。)
  • 如果没有,怎么能找到鼠标类型/ id才能让我用合适的手柄替换合适的鼠标?

来源:

[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;

2 个答案:

答案 0 :(得分:1)

一个应用程序不能影响另一个应用程序游标。为了做到这一点,你必须编写某种类型的鼠标驱动程序。

答案 1 :(得分:0)

我找到了一个暂时隐藏系统光标的好方法,不涉及setsystemcursor()

SetSystemCursor()很危险,因为如果应用程序崩溃或以其他方式抛出错误,光标将永久更改,直到下次重新启动。

相反,我在整个桌面上实现了一个透明窗口,该窗口在需要时隐藏了光标。使用的方法是Win32的ShowCursor。

透明窗口可以是这样的: http://www.codeproject.com/Articles/12597/OSD-window-with-animation-effect-in-C

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

ShowCursor(false);