2015-06-11 103 views
0

我有一個帶有TextBox和其他組件的C#程序。當我用WinSpy ++檢查TextBox(或其他)組件時,我得到了一個在我的C#源代碼中找不到的控件ID。例如 - 見截圖:當我檢查編號爲5的TextBox字段時,WinSpy ++檢測到控制ID爲000209AA。在C#窗口設置WinSpy ++控件ID

C# test program

WinSpy TextBox detection

如何識別WinSpy控件ID?有沒有可能在C#源代碼中設置控件ID?

乾杯, Achim的

+0

這是一個XY問題。你只是看到Handle值回來。 Winforms使用它來確保每個控件都有一個唯一的ID,修補它很容易破壞一些東西。 AccessibleName屬性旨在幫助任何人找回文本框。 –

回答

0

GetDlgCtrlID從user32.dll中提供給定的窗口句柄(即,Control.Handle)控制ID。非常簡單的形式來證明:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     [DllImport("user32.dll")] 
     static extern int GetDlgCtrlID(IntPtr hwnd); 

     private void textBox1_TextChanged(object sender, EventArgs e) 
     { 
      MessageBox.Show("Control ID: " + GetDlgCtrlID(textBox1.Handle)); 
     } 
    } 
} 

我不知道這有什麼辦法設置控制ID - 我懷疑控制ID自動通過Windows窗體莫名其妙的形式建設集。但是能夠檢索它應該足以滿足大多數應用程序的需求(例如直接使用Windows API中的PostMessage/SendMessage。)

+0

謝謝你的回答。但我想自己設置控件ID。我認爲有辦法解決這個問題。當我多次啓動Windows計算器時,所有GUI組件都具有恆定的控制ID。但是當我多次啓動我的小C#應用程序時,我總是從一個GUI組件中獲得不同的控件ID。 – Achim

+0

我不相信這是可能的。從https://msdn.microsoft.com/en-us/library/ms996405.aspx: 「傳統上,UI的標識符是控件ID。這是一個獨立於區域的解決方案,它跨多個實例窗體,並且在90%的時間內是獨一無二的,但是在Windows窗體中,控件ID是該特定控件的HWND的鏡像,因此,每次啓動窗體時控件ID都不同,所以不能用它作爲你的UI標識符。「 常量控件ID應用程序可能是MFC或原始WinAPI應用程序,而不是Windows窗體。 – lyngvi