2016-12-13 12 views
0

ToolTip과 비슷한 정보를 표시하고 싶습니다. 충분한 사용자 정의 기능을 제공하지 못하기 때문에 이상의 전체 시간을 표시해야하므로 ToolTip을 사용할 수 없습니다. .
Cursor.Size은 32x32로 설정되지만 커서의 보이는 부분은 12x19 픽셀이므로 커서의 보이는 부분과 표시하려는 정보 사이에 큰 간격 (20x13 픽셀)이 있습니다. 다른 Windows 버전이나 마우스 커서 설정에 따라 다를 수 있음).Windows 커서 보이는 부분 크기

다른 유형의 커서 (시계/물음표, 손, 등이있는 화살표)가 더 큰 크기라는 것을 알고 있지만 보이는 부분의 크기를 계산하는 방법은 무엇입니까?
ToolTip이 커서 바로 아래에 표시되기 때문에 어떤 방법이 있어야합니다.

이는 ToolTip가 표시됩니다 방법은 다음과 같습니다
standard tooltip
이 내 정보가 표시됩니다 방법은 다음과 같습니다
my tooltip

+0

전화 . 크기? –

+0

@ m.rogalski 동일한 결과를 반환합니다. – Artholl

+0

확실하게 알고 싶었습니다. [이 예제] (http://stackoverflow.com/questions/3509951/how-to-get-mouse-cursor-icon-vs-c)를 확인한 다음 가장 오른쪽 아래의 픽셀 오프셋을 찾을 수 있습니다. 지금 당장의 간단한 생각. 편집 : 잘못된 링크 –

답변

1

감사를 m.rogalski (this question에 저를 지적)과 this answerthis answerthis 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();