감사를 m.rogalski (this question에 저를 지적)과 this answer 및 this answer 및 this article 내가 할 수 있었다으로 마우스 커서의 보이는 부분을 계산하는 코드를 생성합니다. 관리되지 않는 코드를 사용하기 때문에 가장 큰 문제는 메모리 관리 때문이었습니다. 그래서 모든 것을 끝내기를 바랍니다. 그렇지 않으면 알려주세요.
외부
using System;
using System.Runtime.InteropServices;
namespace MouseCursorHelper
{
/// <summary>
/// Source: https://www.codeproject.com/kb/cs/desktopcapturewithmouse.aspx
/// + DestroyIcon, DeleteObject
/// </summary>
class ExternalDlls
{
#region Class Variables
public const Int32 CURSOR_SHOWING = 0x00000001;
[StructLayout(LayoutKind.Sequential)]
public struct ICONINFO
{
public bool fIcon; // Specifies whether this structure defines an icon or a cursor. A value of TRUE specifies
public Int32 xHotspot; // Specifies the x-coordinate of a cursor's hot spot. If this structure defines an icon, the hot
public Int32 yHotspot; // Specifies the y-coordinate of the cursor's hot spot. If this structure defines an icon, the hot
public IntPtr hbmMask; // (HBITMAP) Specifies the icon bitmask bitmap. If this structure defines a black and white icon,
public IntPtr hbmColor; // (HBITMAP) Handle to the icon color bitmap. This member can be optional if this
}
[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
public Int32 x;
public Int32 y;
}
[StructLayout(LayoutKind.Sequential)]
public struct CURSORINFO
{
public Int32 cbSize; // Specifies the size, in bytes, of the structure.
public Int32 flags; // Specifies the cursor state. This parameter can be one of the following values:
public IntPtr hCursor; // Handle to the cursor.
public POINT ptScreenPos; // A POINT structure that receives the screen coordinates of the cursor.
}
#endregion
#region Class Functions
[DllImport("user32.dll", EntryPoint = "GetCursorInfo")]
public static extern bool GetCursorInfo(out CURSORINFO pci);
[DllImport("user32.dll", EntryPoint = "CopyIcon")]
public static extern IntPtr CopyIcon(IntPtr hIcon);
[DllImport("user32.dll", EntryPoint = "GetIconInfo")]
public static extern bool GetIconInfo(IntPtr hIcon, out ICONINFO piconinfo);
[DllImport("user32.dll", EntryPoint = "DestroyIcon")]
public static extern bool DestroyIcon(IntPtr hIcon);
[DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
#endregion
}
}
크기 계산
다음
using System;
using System.Drawing;
using System.Runtime.InteropServices;
namespace MouseCursorHelper
{
class CursorActualSize
{
public static Size GetActualSize()
{
Bitmap bmp;
IntPtr hicon;
ExternalDlls.CURSORINFO ci = new ExternalDlls.CURSORINFO();
ExternalDlls.ICONINFO icInfo;
ci.cbSize = Marshal.SizeOf(ci);
if (ExternalDlls.GetCursorInfo(out ci))
{
if (ci.flags == ExternalDlls.CURSOR_SHOWING)
{
hicon = ExternalDlls.CopyIcon(ci.hCursor);
if (ExternalDlls.GetIconInfo(hicon, out icInfo))
{
bmp = Bitmap.FromHbitmap(icInfo.hbmMask);
var x = 0;
var y = 0;
for (var i = 0; i < bmp.Width; i++)
{
for (var j = 0; j < bmp.Height; j++)
{
var a = bmp.GetPixel(i, j);
if (a.R == 0 && a.G == 0 && a.B == 0)
{
if (i > x)
{
x = i;
}
if (j > y)
{
y = j;
}
}
}
}
bmp.Dispose();
if (hicon != IntPtr.Zero)
{
ExternalDlls.DestroyIcon(hicon);
}
if (icInfo.hbmColor != IntPtr.Zero)
{
ExternalDlls.DeleteObject(icInfo.hbmColor);
}
if (icInfo.hbmMask != IntPtr.Zero)
{
ExternalDlls.DeleteObject(icInfo.hbmMask);
}
if (ci.hCursor != IntPtr.Zero)
{
ExternalDlls.DeleteObject(ci.hCursor);
}
return new Size(x, y);
}
if (hicon != IntPtr.Zero)
{
ExternalDlls.DestroyIcon(hicon);
}
if (icInfo.hbmColor != IntPtr.Zero)
{
ExternalDlls.DeleteObject(icInfo.hbmColor);
}
if (icInfo.hbmMask != IntPtr.Zero)
{
ExternalDlls.DeleteObject(icInfo.hbmMask);
}
}
}
if (ci.hCursor != IntPtr.Zero)
{
ExternalDlls.DeleteObject(ci.hCursor);
}
return new Size(0, 0);
}
}
}
그리고 단순히 어쩌면 대신`당신이 확인할 수 있습니다 Cursor.Size``Cursor.Current의
Size cursorSize = CursorActualSize.GetActualSize();
전화 . 크기? –
@ m.rogalski 동일한 결과를 반환합니다. – Artholl
확실하게 알고 싶었습니다. [이 예제] (http://stackoverflow.com/questions/3509951/how-to-get-mouse-cursor-icon-vs-c)를 확인한 다음 가장 오른쪽 아래의 픽셀 오프셋을 찾을 수 있습니다. 지금 당장의 간단한 생각. 편집 : 잘못된 링크 –