2017-09-06 72 views
-1

我的問題:爲什麼我得到不同的值,我該如何解決這個問題? 以不同的/更好的方式做它也是一個可以接受的答案。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
+0

如果您需要確定與第三方應用程序的交互點,請允許系統幫助您並使用UI自動化。不要試圖破解你自己的。 – IInspectable

+0

應用程序的程序員只是沒有義務使用標準遊標。如果代碼庫是舊的,那麼不太可能使用標準的Hand,它在Windows 2000之前並不存在。艱難的cookie,也許是「這是一個奇怪的句柄」指示就足夠了。 –

+0

@IInspectable:UI自動化不報告其任何應用程序(Spy ++,Inspect,c#UI自動化)中的正確值。所以實際上,我確實需要編寫我自己的工具,儘管它可能是hacky。 – Brokken

回答

0

也許遊標實際上是不同的? Windows上有幾個.DLL與一個手形光標資源。在Windows 98中添加了「官方」系統手形光標,但是如果需要的話,允許控件使用不同的手形光標。

您是否嘗試過比較實際的位圖位?

正確的方法是使用UI Automation。例如,role可能是ROLE_SYSTEM_LINK。您可以使用Microsoft Inspect tool快速瞭解它是否報告了可以使用的角色...

+0

感謝與.DLLs的信息。聽起來對我來說可能是Windows的事情:多個手形光標可用,.NET不使用系統使用的實際光標。 儘管可以提供幫助,但我並不總是會報告正確的值。 – Brokken