3

バックグラウンド:

  • 設定した時間が経過すると、ユーザーのマウスを画面から隠す「マウス隠し」アプリケーションを作成しようとしています。
  • 私は多くのことを試しましたが、SetCursorを使用すると、現在のアプリケーションからマウスが非表示になるだけです。たとえば、トレイに座っても機能する必要があります。
  • 1つの問題を除いて、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;
4

2 に答える 2

0

1つのアプリケーションが別のアプリケーションカーソルに影響を与えることはできません。これを行うには、ある種のマウスドライバを作成する必要があります。

于 2012-05-10T19:42:27.900 に答える
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);
于 2013-10-22T15:14:41.123 に答える