我有一個帶有TextBox和其他組件的C#程序。當我用WinSpy ++檢查TextBox(或其他)組件時,我得到了一個在我的C#源代碼中找不到的控件ID。例如 - 見截圖:當我檢查編號爲5的TextBox字段時,WinSpy ++檢測到控制ID爲000209AA。在C#窗口設置WinSpy ++控件ID
如何識別WinSpy控件ID?有沒有可能在C#源代碼中設置控件ID?
乾杯, Achim的
我有一個帶有TextBox和其他組件的C#程序。當我用WinSpy ++檢查TextBox(或其他)組件時,我得到了一個在我的C#源代碼中找不到的控件ID。例如 - 見截圖:當我檢查編號爲5的TextBox字段時,WinSpy ++檢測到控制ID爲000209AA。在C#窗口設置WinSpy ++控件ID
如何識別WinSpy控件ID?有沒有可能在C#源代碼中設置控件ID?
乾杯, Achim的
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。)
謝謝你的回答。但我想自己設置控件ID。我認爲有辦法解決這個問題。當我多次啓動Windows計算器時,所有GUI組件都具有恆定的控制ID。但是當我多次啓動我的小C#應用程序時,我總是從一個GUI組件中獲得不同的控件ID。 – Achim
我不相信這是可能的。從https://msdn.microsoft.com/en-us/library/ms996405.aspx: 「傳統上,UI的標識符是控件ID。這是一個獨立於區域的解決方案,它跨多個實例窗體,並且在90%的時間內是獨一無二的,但是在Windows窗體中,控件ID是該特定控件的HWND的鏡像,因此,每次啓動窗體時控件ID都不同,所以不能用它作爲你的UI標識符。「 常量控件ID應用程序可能是MFC或原始WinAPI應用程序,而不是Windows窗體。 – lyngvi
這是一個XY問題。你只是看到Handle值回來。 Winforms使用它來確保每個控件都有一個唯一的ID,修補它很容易破壞一些東西。 AccessibleName屬性旨在幫助任何人找回文本框。 –