雖說有不獲得焦點的窗體的例子,可是我並不知道怎麼實現,所以還是讓自己的這樣 "不獲得焦點的窗體"先獲得,然後再把焦點還給他之前的那個焦點窗體
剛開始想的不用API,用Application.OpenForms得到自己程序所有窗體,然後再顯示自己,當然就會得到焦點,然後以前的
有焦點的就會有失去焦點的事件,但沒出來,換API,思路大至一樣.
用到API
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern IntPtr GetActiveWindow();//獲得當前活動窗體
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern IntPtr SetActiveWindow(IntPtr hwnd);//設置活動窗體
QQ的那提示框可以有焦點,只是不點它,不搶焦點而已
那我要做的就是第一次顯示時"不搶焦點"
寫個成員變量
private IntPtr actform=IntPtr.Zero;//保存自己得到焦點前擁有活動窗體的柄
private bool isFristShow=true;//標識是否是首次加載
在構造聚函數裡加入
actform = GetActiveWindow();
重寫Form的OnActivated方法
protected override void OnActivated(EventArgs e)
{
base.OnActivated(e);
if (hwnd != IntPtr.Zero && isFristShow)
{
SetActiveWindow(hwnd);
//已不再是首次加載,下次就可以有焦點了
isFristShow= false;
}
}
我只想到這麼多了,誰有更好的方法教下我QQ:122281069
另還再說一個問題
在上面提到的鏈接中有一個叫"codingsilence"的說了這個
"用Windows Api實現的效果比你這個好多了,代碼是你這個的十分之一"
我也來實現下好了,不過不知道和他想的是否一樣,當然有利有弊,先給出代碼,再談得失
先把API 寫上
// 函數功能:該函數能在顯示與隱藏窗口時能產生特殊的效果。有兩種類型的動畫效果:滾動動畫和滑動動畫
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern void AnimateWindow(IntPtr hwnd, int stime, int style);
可以在加載和關閉還有其它事件裡使用這個函數
這裡只寫一個打開時的效果例子,因為簡單,不多寫了,在窗體裡加入這個
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
//第二個參數就是漸變的時間了
AnimateWindow(this.Handle, 2000, 0x80000/*AW_BLEND*/);
}
哈,強吧,一句話就搞了那麼復雜的效果,不過他的缺點就是,這個時間長的話,最好用多線程
因為這個函數要執行裡面設置的那以長時間,會造成這一時間段同一線程上的其它界面不響應用戶操作的,不過總體來說還是這個好
都看到這了,可不可以頂下啊...