我的问题:为什么我得到不同的值,我该如何解决这个问题? 以不同的/更好的方式做它也是一个可以接受的答案。WinAPI:Cursors.Hand.Handle返回错误/不同的值
我使用MS Visual Studio 2017并在Windows 8.1和Windows 10上测试过。结果/行为是相同的。
我有一个调查另一个程序的GUI的c#程序。作为我的一部分,我尝试检查鼠标光标的当前状态以标识WebLinks,可调整大小的区域等。我使用pinvoke GetCursorInfo()获取当前游标并将其句柄与System.Windows.Forms之一的句柄进行比较。光标。 这适用于所有游标,除了一个:Cursors.Hand.Handle与当前游标相比,当它是手时,会返回一个不同的句柄。为了确定Cursors.Hand在做什么,我检查了它的位置。它总是在左上角(5,0)。 这里是我的代码:
[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.
// 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.
}
[DllImport("user32.dll")]
public static extern bool GetCursorInfo(out CURSORINFO pci);
public static int GetCursorHandle()
{
CURSORINFO pci;
pci.cbSize = Marshal.SizeOf(typeof(CURSORINFO));
GetCursorInfo(out pci);
return (int)pci.hCursor;
}
public static bool IsHandCursor()
{
var h = Cursors.Hand.Handle;
CURSORINFO pci;
pci.cbSize = Marshal.SizeOf(typeof(CURSORINFO));
GetCursorInfo(out pci);
return pci.hCursor == h;
}
探讨我列出的所有光标处理问题:
public static void ListCursorHandles()
{
Console.WriteLine("Default =" + (UInt64)Cursors.Default.Handle);
Console.WriteLine("Wait =" + (UInt64)Cursors.WaitCursor.Handle);
Console.WriteLine("Hand =" + (UInt64)Cursors.Hand.Handle);
Console.WriteLine("IBeam =" + (UInt64)Cursors.IBeam.Handle);
Console.WriteLine("Help =" + (UInt64)Cursors.Help.Handle);
Console.WriteLine("No =" + (UInt64)Cursors.No.Handle);
Console.WriteLine("NoMove2D =" + (UInt64)Cursors.NoMove2D.Handle);
Console.WriteLine("NoMoveHoriz =" + (UInt64)Cursors.NoMoveHoriz.Handle);
Console.WriteLine("NoMoveVert =" + (UInt64)Cursors.NoMoveVert.Handle);
Console.WriteLine("PanEast =" + (UInt64)Cursors.PanEast.Handle);
Console.WriteLine("PanNE =" + (UInt64)Cursors.PanNE.Handle);
Console.WriteLine("PanNorth =" + (UInt64)Cursors.PanNorth.Handle);
Console.WriteLine("PanNW =" + (UInt64)Cursors.PanNW.Handle);
Console.WriteLine("PanSE =" + (UInt64)Cursors.PanSE.Handle);
Console.WriteLine("PanSouth =" + (UInt64)Cursors.PanSouth.Handle);
Console.WriteLine("PanSW =" + (UInt64)Cursors.PanSW.Handle);
Console.WriteLine("PanWest =" + (UInt64)Cursors.PanWest.Handle);
Console.WriteLine("SizeAll =" + (UInt64)Cursors.SizeAll.Handle);
Console.WriteLine("SizeNESW =" + (UInt64)Cursors.SizeNESW.Handle);
Console.WriteLine("SizeNS =" + (UInt64)Cursors.SizeNS.Handle);
Console.WriteLine("SizeNWSE =" + (UInt64)Cursors.SizeNWSE.Handle);
Console.WriteLine("SizeWE =" + (UInt64)Cursors.SizeWE.Handle);
Console.WriteLine("Arrow =" + (UInt64)Cursors.Arrow.Handle);
Console.WriteLine("Cross =" + (UInt64)Cursors.Cross.Handle);
Console.WriteLine("UpArrow =" + (UInt64)Cursors.UpArrow.Handle);
Console.WriteLine("HSplit =" + (UInt64)Cursors.HSplit.Handle);
Console.WriteLine("VSplit =" + (UInt64)Cursors.VSplit.Handle);
}
对于我得到如下结果: (手)是指由GetCursorInfo(返回的值)而光标悬停在任何WebLink上。
- 默认= 65 539
- 箭头= 65 539
- IBEAM = 65 541
- 等待= 65个543个
- 交叉= 65 545
- UPARROW = 65 547
- SizeNWSE = 65 549
- SizeNESW = 65 551
- SizeWE = 65 553
- SizeNS = 65 555
- SizeAll = 65 557
- 否= 65 559
- 帮助= 65 563
- (手)= 65 567
- NoMoveHoriz = 132 511
- 手= 525 959
- PanNorth = 787 823
- PanNW = 2 098 587
- NoMoveVert = 2 360 917
- HSplit = 2 492 065
- PanSE = 6 162 189
- PanWest = 8 193 443
- PANNE = 11 404 697
- VSPLIT = 13 502 007
- PanEast = 17 565 195
- PanSW = 18 089 355
- NoMove2D = 24 118 807
- PanSouth = 31 721 289
如果您需要确定与第三方应用程序的交互点,请允许系统帮助您并使用UI自动化。不要试图破解你自己的。 – IInspectable
应用程序的程序员只是没有义务使用标准游标。如果代码库是旧的,那么不太可能使用标准的Hand,它在Windows 2000之前并不存在。艰难的cookie,也许是“这是一个奇怪的句柄”指示就足够了。 –
@IInspectable:UI自动化不报告其任何应用程序(Spy ++,Inspect,c#UI自动化)中的正确值。所以实际上,我确实需要编写我自己的工具,尽管它可能是hacky。 – Brokken