2012-07-16 52 views
-1

我想檢查一個表單是否具有表單邊框的句柄。 而且,句柄來自另一個應用程序。有辦法檢查表單是否有表單邊框? (通過句柄)

我該如何處理? 請幫我..謝謝!

+2

Windows Forms?原生Win32?還有別的嗎? - 請注意,C#作爲*語言*並不知道任何關於句柄和窗口等,所以你的問題必須是關於特定的UI框架。請相應標記。 – stakx 2012-07-16 21:22:25

+1

P.S. Win32甚至不區分窗口和控件。從技術上講,它們都是「窗戶」,儘管它們具有不同的屬性。 – stakx 2012-07-16 21:24:59

+0

嗯..我只是想知道它是否有FormBorder或沒有。該句柄來自另一個應用程序。 – jn4kim 2012-07-16 21:27:11

回答

2
[DllImport("user32.dll")] 
extern static int GetWindowLong(IntPtr hWnd, int nIndex); 

const int GWL_STYLE = -16; 
const int WS_BORDER = 0x00800000; // thin border 
const int WS_THICKFRAME = 0x00040000; // sizing (thick) border 

public static bool NativeWindowHasBorder(IntPtr hWnd) 
{ 
    return (GetWindowLong(hWnd, GWL_STYLE) & (WS_BORDER | WS_THICKFRAME)) != 0; 
} 
+0

非常感謝。 – jn4kim 2012-07-16 22:22:50

+0

如果您使用'IntPtr',它不應該是'GetWindowLongPtr'嗎?如果你使用'Int32',還是'GetWindowLong'?或者:爲什麼'.ToInt64()'轉換? – stakx 2012-07-17 16:58:54

+0

@stakx是的。我不記得如何讓窗戶風格脫離我的頭頂,並將它貼在做錯了的人身上。我糾正了它。 – Tergiver 2012-07-17 17:42:14

0

Control本身實際上並沒有處理。 Control.Handle實際返回它的父窗口的.Handle

MSDN for Control.Handle

獲取窗口句柄控件綁定到。

如果你看一下Control反編譯源代碼,你會看到:

internal IntPtr HandleInternal 
{ 
    get 
    { 
    return this.window.Handle; 
    } 
} 

編輯

什麼我上面所述是完全不正確。我爲了歷史的緣故離開它。

可以通過將Button放在Form上,並查看它們的IntPtr Handle值來很容易地證明這一點。他們是不同的。

+0

嗯,發佈反編譯的框架代碼是否是一個好主意/合法......?我不想欺騙你,但這可能值得一想。 PS:反編譯的代碼幾乎沒有任何關於'this.window'是什麼意思的知識。 – stakx 2012-07-16 21:30:17

+0

Thankyou爲你的答案,但這不是我想知道的,我想我沒有正確寫下這個問題 – jn4kim 2012-07-16 21:32:55

+0

@stakx我認爲這很清楚,控制本身沒有句柄,而是它返回它的父窗戶的手柄。正如MSDN文本所描述的一樣。 – 2012-07-16 21:34:29

相關問題