一個新的項目需要用到系統置頂的功能,本來是件很簡單的事情,但是越做發現並不那麼簡單,所以記錄下來: 系統環境:win7旗艦版本64位; IDE :VS2013; WPF+C#開發。 一、開始用Topmost屬性設置為true。 運行木有問題,很簡單喲。呵呵,隨後運行打開osk.exe;卵,被按下去了 ...
一個新的項目需要用到系統置頂的功能,本來是件很簡單的事情,但是越做發現並不那麼簡單,所以記錄下來:
系統環境: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的這個開始菜單是麽子做的啊?
不過拿搜狗的輸入法測試了一下,呵呵
園子里有搜狗工程師麽?怎麼實現的?怎麼實現的?怎麼實現的? 然後拿自己的視窗和搜狗輸入法兩個軟體比對,如下: 我的視窗又在搜狗輸入法的上面了。真是***** 大神在哪裡?大神在哪裡?大神在哪裡?