1. 程式人生 > >創建類似於輸入法窗口的非激活窗口

創建類似於輸入法窗口的非激活窗口

輸入法 info setw 程序 pan -- blog import helper

原文:創建類似於輸入法窗口的非激活窗口

創建類似於輸入法窗口的非激活窗口
周銀輝

我們註意到輸入法的候選詞窗口是不會被激活而獲得輸入焦點的, 一個很明顯的現象是當你用鼠標點擊該窗口時, 系統焦點不會轉移到該窗口上, 原來獲得焦點的窗口不會失去焦點. 這很棒, 如何實現呢?
很簡單, 只要將窗口的ExStyle設置為WS_EX_NOACTIVATE(0x8000000)即可. (另外, 值得註意的是, 如果窗口在任務欄顯示圖標的話, 仍可以通過任務欄圖標來激活它)

方式1, winform窗口中, 通過重寫CreateParams屬性來修改ExStyle:
protected override CreateParams CreateParams
{
get
{
CreateParams cp
= base.CreateParams;
cp.ExStyle
|= WS_EX_NOACTIVATE;

return cp;
}
}

方式2, 通過SetWindowLong函數來設置窗口的ExStyle
public const int GWL_EXSTYLE = -20;
public const int WS_EX_NOACTIVATE = 0x8000000;

[DllImport(
"user32.dll
")]
public static extern int SetWindowLong(IntPtr window, int index, int value);

[DllImport(
"user32.dll")]
public static extern int GetWindowLong(IntPtr window, int index);

static void Test(IntPtr hwnd)
{
SetWindowLong(hwnd, GWL_EXSTYLE,
             GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_NOACTIVATE);
}
調用上面的Test(IntPtr hwnd)方法就可以了, 對於WPF程序, 可以通過new WindowInteropHelper(myWindow).Handle來獲取窗口句柄

創建類似於輸入法窗口的非激活窗口