一個新的項目需要用到系統置頂的功能,本來是件很簡單的事情,但是越做發現並不那么簡單,所以記錄下來:
系統環境:win7旗艦版本64位;
IDE :VS2013;
WPF+C#開發。
一、開始用Topmost屬性設置為true。
運行木有問題,很簡單喲。呵呵,隨后運行打開osk.exe;卵,被按下去了。
查資料,人家也用了置頂的功能,兩個都在置頂,而且一旦被人家(osk.exe)按下去就再也上不來。
二、那就用笨點的辦法唄,循環設置Topmost = true;
while (true)
{
try
{
Thread.Sleep(2);
lock (_thisLock)
{
this.Dispatcher.Invoke(new Action(() =>
{
this.Topmost = false;
}), null);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
嘿嘿,搞定。然后在win7的系統上實現各種功能。終於算是開發完了,然后測試。
發現一個問題:
win7系統在areo主題下有個預覽窗口,如上圖,在上面那種情況下,我的窗口是沒法置頂。
在微軟論壇發帖子找大神解救,大神的解答如下:
“
Hi,
簡單的說,不能,Windows7的任務欄(縮略圖)預覽本身是一個窗口,而你想實現直接把一個WPF的窗口setparent到預覽窗口,相當於當前wpf窗體必須有兩個同樣的窗體實例,一個在桌面,一個在預覽窗口。
如果你想在這個預覽窗口和你的程序直接交互,那么Windows API Code Pack縮略圖按鈕和跳轉列表可能是你想要的,直接操作這個Windows7的任務欄縮略圖預覽功能是不能的。
”
好吧!先只好把這個問題放一邊,如果園子有大神有解決方案,歡迎留言。
然后win7系統的測試告一段落;
=============================================================================
系統環境:win10企業版本64位;
IDE :VS2013;
WPF+C#開發。
win10系統測試,在其他軟件層面上置頂是都ok的,但是在開始菜單上沒法置頂,如下圖:
然后又各種找資料加測試,用過的方法有以下:
HwndSource source = (HwndSource)PresentationSource.FromVisual(this);
IntPtr handle = source.Handle;
bool b1 = BringWindowToTop(handle);
------------------------------------------------------------
IntPtr CustomBar = FindWindow(null, "MainWindow"); //程序中需要置頂的窗體的名字
IntPtr desktop= GetDesktopWindow();
if (CustomBar != null)
{
SetWindowPos(CustomBar, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
SetParent(desktop, CustomBar);
}
------------------------------------------------
就是各種win32的API吧,還是不行啊!大神們有解決方案嗎?win10的這個開始菜單是么子做的啊?
不過拿搜狗的輸入法測試了一下,呵呵

