1. 程式人生 > >C#獲取視窗控制代碼概念和方法例項

C#獲取視窗控制代碼概念和方法例項

在Windows中,控制代碼是一個系統內部資料結構的引用。例如當你操作一個視窗,或說是一個Delphi窗體時,系統會給你一個該視窗的控制代碼,系統會通知你:你正在操作142號視窗,就此你的應用程式就能要求系統對142號視窗進行操作——移動視窗、改變視窗大小、把視窗極小化為圖示等。實際上許多 Windows API函式把控制代碼作為它的第一個引數,如GDI(圖形裝置介面)控制代碼、選單控制代碼、例項控制代碼、點陣圖控制代碼等,不僅僅侷限於視窗函式。換句話說,控制代碼是一種內部程式碼,通過它能引用受系統控制的特殊元素,如視窗、點陣圖、圖示、記憶體塊、游標、字型、選單等。

Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
  Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
  Private Const WS_EX_LAYERED = &H80000
  Private Const GWL_EXSTYLE = (-20)
  Private Const LWA_ALPHA = &H2
  Private Sub Form_Activate()
  On Error Resume Next
  For i = 0 To 150 Step 2.5
  SetLayeredWindowAttributes Me.hwnd, 0, i, LWA_ALPHA
  DoEvents
  Next i
  End Sub
  Private Sub Form_load()
  Dim rtn As Long
  rtn = GetWindowLong(Me.hwnd, GWL_EXSTYLE)
  rtn = rtn Or WS_EX_LAYERED
  SetWindowLong Me.hwnd, GWL_EXSTYLE, rtn
  SetLayeredWindowAttributes Me.hwnd, 0, 0, LWA_ALPHA
  End Sub

//獲取視窗標題
[DllImport("user32", SetLastError = true)]
public static extern int GetWindowText(
    IntPtr hWnd,//視窗控制代碼
    StringBuilder lpString,//標題
    int nMaxCount //最大值
    );
 
//獲取類的名字
[DllImport("user32.dll")]
private static extern int GetClassName(
    IntPtr hWnd,//控制代碼
    StringBuilder lpString, //類名
    int nMaxCount //最大值
    );
 
//根據座標獲取視窗控制代碼
[DllImport("user32")]
private static extern IntPtr WindowFromPoint(
Point Point  //座標
);
 
private void timer1_Tick(object sender, EventArgs e)
{
    int x = Cursor.Position.X;
    int y = Cursor.Position.Y;
    Point p = new Point(x, y);
    IntPtr formHandle = WindowFromPoint(p);//得到視窗控制代碼
    StringBuilder title = new StringBuilder(256);
    GetWindowText(formHandle, title, title.Capacity);//得到視窗的標題
    StringBuilder className = new StringBuilder(256);
    GetClassName(formHandle, className, className.Capacity);//得到視窗的控制代碼
    this.textBox1.Text = title.ToString();
    this.textBox2.Text = formHandle.ToString();
    this.textBox3.Text = className.ToString();
}