主頁 > 軟體工程 > 如何強悍地實作“置頂視窗”,讓視窗不被其他視窗覆寫

如何強悍地實作“置頂視窗”,讓視窗不被其他視窗覆寫

2020-09-14 06:56:20 軟體工程

使用WS_EX_TOPMOST創建或SetWindowPos(hWnd, HWND_TOPMOST, ...)設定的置頂視窗,仍然可以被其他置頂視窗所覆寫

如何能夠優雅地實作視窗置頂后不能被其他頂層視窗覆寫?

WIN10系統自帶的任務管理器中,設定“置于頂層”后無法被其他置頂視窗覆寫(僅WIN10,WIN7會被覆寫),這和我期望的完美吻合,但不知如何實作

之前嘗試過失去焦點時AttachThreadInput其他頂層視窗后,再SetForegroundWindow自己,具體代碼如下:


LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
WNDCLASSEXW wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TOPWNDTEST));
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = L"TopWndTest";
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
RegisterClassExW(&wcex);

HWND hWnd = CreateWindowExW(WS_EX_TOPMOST, L"TopWndTest", L"這是一個置頂視窗", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 600, 400, nullptr, nullptr, hInstance, nullptr);
if (!hWnd)
return FALSE;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

MSG msg;
while (GetMessage(&msg, nullptr, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_KILLFOCUS:
{
HWND hForegdWnd = GetForegroundWindow();
DWORD dwForegdWndThreadID = GetWindowThreadProcessId(hForegdWnd, NULL);
DWORD dwThreadID = GetCurrentThreadId();
AttachThreadInput(dwThreadID, dwForegdWndThreadID, TRUE);
SetForegroundWindow(hWnd);
SetFocus(hWnd);
AttachThreadInput(dwThreadID, dwForegdWndThreadID, FALSE);
break;
}
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}


但上述方法有較多局限且不夠優雅:1、影響其他視窗訊息;2、效率低拖動時閃爍;3、仍然會被WIN10任務管理器覆寫

有沒大牛對此有研究過,指點一二

uj5u.com熱心網友回復:

定時器 不斷的置頂

uj5u.com熱心網友回復:

參考 1 樓 zgl7903 的回復:
定時器 不斷的置頂


這方法和失去焦點時不斷置頂本質一樣,而且沒必把代碼放定時器

不使用AttachThreadInput,SetForegroundWindow經常失敗

uj5u.com熱心網友回復:


void CDlg9Dlg::OnTimer(UINT nIDEvent) 
{
  // TODO: Add your message handler code here and/or call default
  ::SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
 
  CDialog::OnTimer(nIDEvent);
}

uj5u.com熱心網友回復:

會不會是系統對那一個表單“特殊照顧”而實作的結果呢?

畢竟用真正“TOPMOST”的只能有一個,通過創建時標識或“后期”API置頂,
  那些視窗都是“平級”的,這時自然就是哪個表單擁有焦點、哪個表單就會到“最頂層”。

uj5u.com熱心網友回復:

參考 3 樓 zgl7903 的回復:

void CDlg9Dlg::OnTimer(UINT nIDEvent) 
{
  // TODO: Add your message handler code here and/or call default
  ::SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
 
  CDialog::OnTimer(nIDEvent);
}



不行,只這樣設定沒什么效果,視窗雖然被其他置頂視窗覆寫,但他本身是置頂的狀態仍然沒變,所以再設定也是沒用的

uj5u.com熱心網友回復:

參考 4 樓 Chen8013 的回復:
會不會是系統對那一個表單“特殊照顧”而實作的結果呢?

畢竟用真正“TOPMOST”的只能有一個,通過創建時標識或“后期”API置頂,
  那些視窗都是“平級”的,這時自然就是哪個表單擁有焦點、哪個表單就會到“最頂層”。


就目前公開的API來看好像確實是這樣

uj5u.com熱心網友回復:

只想問問強悍的程式開2個,肯定有一個不強悍了吧。還是定時器大法好 

uj5u.com熱心網友回復:

參考 8 樓 caozhy 的回復:
只想問問強悍的程式開2個,肯定有一個不強悍了吧。還是定時器大法好 


只需要比普通置頂的視窗強悍就行,比上不足比下有余就行,畢竟現在的普通置頂視窗很多

uj5u.com熱心網友回復:

參考 9 樓 paschen 的回復:
Quote: 參考 8 樓 caozhy 的回復:

只想問問強悍的程式開2個,肯定有一個不強悍了吧。還是定時器大法好 


只需要比普通置頂的視窗強悍就行,比上不足比下有余就行,畢竟現在的普通置頂視窗很多

我覺得你真想達到那種“預期效果”,可能只有用“耍流氓”的手法了,
  簡單易實作,只是“手感”(就是“用戶體驗”)可能有時候稍差點。

其實就“瘟到死系統”來說,它的“置頂”也并不是完全可靠的:
在“視窗模式”(就是沒有“全屏”的程式)下,WinXP、Win7,我都遇到過很多回了,
 象“記事本”之流的普通視窗,有時候莫明其妙的能蓋住“任務欄”,
 具體怎么出現的我也記不太清楚了,反正遇到的次數不少……
 都是感覺“莫明其妙”的出現、又莫明其妙的恢復正常。
Win10系統我極少使用,目前還沒什么印象,估計也會有同樣問題。

uj5u.com熱心網友回復:

參考 9 樓 paschen 的回復:
Quote: 參考 8 樓 caozhy 的回復:

只想問問強悍的程式開2個,肯定有一個不強悍了吧。還是定時器大法好 


只需要比普通置頂的視窗強悍就行,比上不足比下有余就行,畢竟現在的普通置頂視窗很多

真正的強制應該是類似windows 8的超級工具列那樣(win+c打開的時鐘/右邊4個按鈕),不屬于視窗管理系統,那才叫置頂。

uj5u.com熱心網友回復:

參考 11 樓 caozhy 的回復:
Quote: 參考 9 樓 paschen 的回復:

Quote: 參考 8 樓 caozhy 的回復:

只想問問強悍的程式開2個,肯定有一個不強悍了吧。還是定時器大法好 


只需要比普通置頂的視窗強悍就行,比上不足比下有余就行,畢竟現在的普通置頂視窗很多

真正的強制應該是類似windows 8的超級工具列那樣(win+c打開的時鐘/右邊4個按鈕),不屬于視窗管理系統,那才叫置頂。


沒用過那個,那它用的什么?還是創建視窗時指定了某種STYLE

uj5u.com熱心網友回復:

參考 10 樓 Chen8013 的回復:
Quote: 參考 9 樓 paschen 的回復:

Quote: 參考 8 樓 caozhy 的回復:

只想問問強悍的程式開2個,肯定有一個不強悍了吧。還是定時器大法好 


只需要比普通置頂的視窗強悍就行,比上不足比下有余就行,畢竟現在的普通置頂視窗很多

我覺得你真想達到那種“預期效果”,可能只有用“耍流氓”的手法了,
  簡單易實作,只是“手感”(就是“用戶體驗”)可能有時候稍差點。

其實就“瘟到死系統”來說,它的“置頂”也并不是完全可靠的:
在“視窗模式”(就是沒有“全屏”的程式)下,WinXP、Win7,我都遇到過很多回了,
 象“記事本”之流的普通視窗,有時候莫明其妙的能蓋住“任務欄”,
 具體怎么出現的我也記不太清楚了,反正遇到的次數不少……
 都是感覺“莫明其妙”的出現、又莫明其妙的恢復正常。
Win10系統我極少使用,目前還沒什么印象,估計也會有同樣問題。


WIN10那個任務管理器就真很完美,不知是不是“特殊照顧”,遲點跟一下

uj5u.com熱心網友回復:

試試視窗穿透置頂會咋樣

uj5u.com熱心網友回復:

這個我之前研究過,不過后來太忙,沒有繼續弄,應該是系統有特殊處理
我補充一下,Win10任務管理器的置頂實在太牛,別說其他TOP_MOST表單了,就連彈出的開始選單,桌面下方的任務欄,桌面的右鍵彈出選單,通通擋不住他
而樓主的AttachThreadInput其他頂層視窗方案即使能勉強擋住其他TOP_MOST,也擋不住開始選單。

uj5u.com熱心網友回復:

其實你的SetForegroundWindow是失敗的

uj5u.com熱心網友回復:

參考 5 樓 paschen 的回復:
Quote: 參考 3 樓 zgl7903 的回復:


void CDlg9Dlg::OnTimer(UINT nIDEvent) 
{
  // TODO: Add your message handler code here and/or call default
  ::SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
 
  CDialog::OnTimer(nIDEvent);
}



不行,只這樣設定沒什么效果,視窗雖然被其他置頂視窗覆寫,但他本身是置頂的狀態仍然沒變,所以再設定也是沒用的


他這個只是一個勁的置頂,你在置頂之前加一句取消置頂,兩句配合用,好像好使

uj5u.com熱心網友回復:

參考 18 樓 zanfeng 的回復:
試試視窗穿透置頂會咋樣


你指的是WS_EX_TRANSPARENT嗎?

uj5u.com熱心網友回復:

參考 19 樓 xuzzzhen123 的回復:
這個我之前研究過,不過后來太忙,沒有繼續弄,應該是系統有特殊處理
我補充一下,Win10任務管理器的置頂實在太牛,別說其他TOP_MOST表單了,就連彈出的開始選單,桌面下方的任務欄,桌面的右鍵彈出選單,通通擋不住他
而樓主的AttachThreadInput其他頂層視窗方案即使能勉強擋住其他TOP_MOST,也擋不住開始選單。


你說的沒錯,普通的置頂視窗是會被開始選單覆寫的,但WIN10任務管理器不會,看來自己要實作不容易 

uj5u.com熱心網友回復:

參考 20 樓 DelphiGuy 的回復:
其實你的SetForegroundWindow是失敗的


沒錯,所以加上了AttachThreadInput讓它成功,但也不是百分百成功

uj5u.com熱心網友回復:

	case  WM_KILLFOCUS:
SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);

uj5u.com熱心網友回復:

除了api還有gui 介面啊。。你呼叫gui介面置頂即可了。。。達到和任務管理器一個級別。。。ahk腳本

uj5u.com熱心網友回復:

參考 26 樓 attilax 的回復:
除了api還有gui 介面啊。。你呼叫gui介面置頂即可了。。。達到和任務管理器一個級別。。。ahk腳本


請問什么GUI介面,沒聽說過,可否說明白一點,試了用ahk腳本置頂視窗,仍然是普通版的置頂呢

uj5u.com熱心網友回復:

uj5u.com熱心網友回復:

能否把滑鼠的焦點范圍控制在你的對話框區域之內

uj5u.com熱心網友回復:

參考 30 樓 shiyanbo_1006 的回復:
能否把滑鼠的焦點范圍控制在你的對話框區域之內


ClipCursor就可以,但又不是說只能通過滑鼠激活其他視窗

uj5u.com熱心網友回復:

參考 22 樓 paschen 的回復:
Quote: 參考 18 樓 zanfeng 的回復:

試試視窗穿透置頂會咋樣


你指的是WS_EX_TRANSPARENT嗎?

嗯,

uj5u.com熱心網友回復:

試試看。就是滑鼠,鍵盤,訊息不能獲取了,需要弄個HOOK。再處理

uj5u.com熱心網友回復:

參考 32 樓 zanfeng 的回復:
Quote: 參考 22 樓 paschen 的回復:

Quote: 參考 18 樓 zanfeng 的回復:

試試視窗穿透置頂會咋樣


你指的是WS_EX_TRANSPARENT嗎?

嗯,


這個只是把訊息傳到后面的視窗,對置頂沒用

uj5u.com熱心網友回復:

樓主有什么新發現沒?

uj5u.com熱心網友回復:

參考 35 樓 Chen8013 的回復:
樓主有什么新發現沒?


還沒新發現,這問題不一定能完美解決,主要來聽下大家意見

uj5u.com熱心網友回復:

參考 17 樓 zhao4zhong1 的回復:
百度搜相關關鍵字。

https://www.baidu.com/s?wd=win10%20任務管理器%20視窗置頂

uj5u.com熱心網友回復:

參考 34 樓 paschen 的回復:
Quote: 參考 32 樓 zanfeng 的回復:

Quote: 參考 22 樓 paschen 的回復:

Quote: 參考 18 樓 zanfeng 的回復:

試試視窗穿透置頂會咋樣


你指的是WS_EX_TRANSPARENT嗎?

嗯,


這個只是把訊息傳到后面的視窗,對置頂沒用

配合使用。置頂的肯定是要用的

uj5u.com熱心網友回復:

矛和盾的問題么?

uj5u.com熱心網友回復:

在水區問過樓主了,樓主說還沒解決,好可憐啊。

uj5u.com熱心網友回復:

參考 42 樓 xuzzzhen123 的回復:
在水區問過樓主了,樓主說還沒解決,好可憐啊。


沒什么好可憐,本來就知道這問題不容易,主要是聽下大家看法

uj5u.com熱心網友回復:

理論上可以(未測驗):
建立一個隱藏視窗,設定為自己可見視窗的Parent
周期性(也可以在WM_ACTIVATEAPP中處理)OpenDesktop、EnumDesktopWindows
如果列舉到的視窗可見,(其Parent不是自己的隱藏視窗)將其Parent設定為自己的隱藏視窗
SetWindowPos自己的可見視窗

uj5u.com熱心網友回復:

為什么手機客戶端不能寫博客?

uj5u.com熱心網友回復:

參考 44 樓 DelphiGuy 的回復:
理論上可以(未測驗):
建立一個隱藏視窗,設定為自己可見視窗的Parent
周期性(也可以在WM_ACTIVATEAPP中處理)OpenDesktop、EnumDesktopWindows
如果列舉到的視窗可見,(其Parent不是自己的隱藏視窗)將其Parent設定為自己的隱藏視窗
SetWindowPos自己的可見視窗


@DelphiGuy,感謝你提供的思路,此思路基本是我想要的了,雖然沒WIN10任務管理器那么強,但可以完美覆寫普通的置頂視窗,是我希望的效果,但按你的方法目前還有個問題沒解決:

在WIN10測驗,如果進行列舉,對所有列舉到非隱藏視窗設定父視窗后,則會導致直接顯示一個空白桌面(其他什么都看不到,必須重啟explorer行程才能恢復);
我同時測驗了不列舉,只對我已知的另一個置頂視窗進行設定,可完美覆寫該置頂視窗。
是否列舉到的部分視窗不應改變其父視窗,可否再指導一下。


附上我按你思路寫的測驗代碼:


HWND hWndParent;

LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR    lpCmdLine,
_In_ int       nCmdShow)
{
WNDCLASSEXW wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = L"TopWndTest";
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
RegisterClassExW(&wcex);

hWndParent = CreateWindowExW(WS_EX_TOPMOST, L"TopWndTest", L"這是一個置頂視窗的父視窗(隱藏)", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 600, 400, nullptr, nullptr, hInstance, nullptr);
if (!hWndParent)
return FALSE;
HWND hWnd = CreateWindowExW(WS_EX_TOPMOST, L"TopWndTest", L"這是一個置頂視窗", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 600, 400, hWndParent, nullptr, hInstance, nullptr);
if (!hWnd)
return FALSE;

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

MSG msg;
while (GetMessage(&msg, nullptr, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}

BOOL CALLBACK EnumWindowsProc(_In_ HWND hWnd, _In_ LPARAM lParam)
{
if (IsWindowVisible(hWnd) && GetParent(hWnd) != hWndParent)
{
SetParent(hWnd, hWndParent);
}

return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_KILLFOCUS:
{
//HWND hForegdWnd = GetForegroundWindow();
//DWORD dwForegdWndThreadID = GetWindowThreadProcessId(hForegdWnd, NULL);
//DWORD dwThreadID = GetCurrentThreadId();
//AttachThreadInput(dwThreadID, dwForegdWndThreadID, TRUE);
//SetForegroundWindow(hWnd);
//SetFocus(hWnd);
//AttachThreadInput(dwThreadID, dwForegdWndThreadID, FALSE);
break;
}
case WM_ACTIVATEAPP:
{
if (!wParam) //being deactivated
{
HDESK hDesk = OpenDesktop(TEXT("Default"), 0, FALSE, DESKTOP_ENUMERATE);
if (!hDesk)
{
MessageBox(0, TEXT("OpenDesktop Failed!"), 0, 0);
return 0;
}
if (!EnumDesktopWindows(hDesk, (WNDENUMPROC)EnumWindowsProc, 0))
{
MessageBox(0, TEXT("EnumDesktopWindows Failed!"), 0, 0);
return 0;
}
CloseDesktop(hDesk);
//SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
}
break;
}
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

uj5u.com熱心網友回復:

參考 44 樓 DelphiGuy 的回復:
理論上可以(未測驗):
建立一個隱藏視窗,設定為自己可見視窗的Parent
周期性(也可以在WM_ACTIVATEAPP中處理)OpenDesktop、EnumDesktopWindows
如果列舉到的視窗可見,(其Parent不是自己的隱藏視窗)將其Parent設定為自己的隱藏視窗
SetWindowPos自己的可見視窗


不好意思,再經測驗,發現上面說的也不完全準確,離我想要的效果還是差了一點點

按上述代碼,對于普通置頂視窗,如果點擊非標題欄部分,無法覆寫我程式視窗,但如果點擊其標題欄,則可覆寫

uj5u.com熱心網友回復:

我反匯編了一下win10的taskmgr.exe,發現它也用了OpenDesktop和EnumDesktopWindows,估計思路差不多吧,但是taskmgr有很多C++寫的方法,不是純API呼叫,還沒有研究徹底。
另外,它用了兩個user32的匯出函式:
    (hint = 01E4) GhostWindowFromHungWindow
    (hint = 01E9) HungWindowFromGhostWindow
不清楚有什么用

uj5u.com熱心網友回復:

參考 48 樓 DelphiGuy 的回復:
我反匯編了一下win10的taskmgr.exe,發現它也用了OpenDesktop和EnumDesktopWindows,估計思路差不多吧,但是taskmgr有很多C++寫的方法,不是純API呼叫,還沒有研究徹底。
另外,它用了兩個user32的匯出函式:
    (hint = 01E4) GhostWindowFromHungWindow
    (hint = 01E9) HungWindowFromGhostWindow
不清楚有什么用


這兩個未公開API我查了一下,大概說的是:一個視窗如果沒有回應,會創建一個影子視窗GhostWindow,GetForegroundWindow等函式獲取到的實際是這個影子視窗句柄,而不是實際懸掛起來的視窗句柄,這兩個API就是在兩者之間進行一個轉換。

我再研究一下吧,你有時間也可幫看一下

uj5u.com熱心網友回復:

DedkPins 這個軟體的寫法可能對你有幫助,它是讓其他視窗置頂的,
與任務管理器可以相互遮蓋,
在xp下,不能遮蓋開始選單視窗,如果針對開始選單專門處理一下,估計也可以
有原始碼下載

uj5u.com熱心網友回復:

參考 50 樓 JohnYale 的回復:
DedkPins 這個軟體的寫法可能對你有幫助,它是讓其他視窗置頂的,
與任務管理器可以相互遮蓋,
在xp下,不能遮蓋開始選單視窗,如果針對開始選單專門處理一下,估計也可以
有原始碼下載


感謝回復,但deskpins實作的只是普通置頂,是覆寫不了WIN10置頂后的任務管理器的

uj5u.com熱心網友回復:

https://bbs.csdn.net/topics/391880391

uj5u.com熱心網友回復:

參考 52 樓 zhao4zhong1 的回復:
https://bbs.csdn.net/topics/391880391


感謝回復,切換桌面顯示仍然會被這個桌面其他置頂視窗覆寫了

uj5u.com熱心網友回復:

有沒有用?
When a software is not responding,windows automatecaly transforms the window of that program into a ghost window.This means that the user can no longer interact with the that window.The function is FrostCrashedWindow and it is located in user32.dll.

uj5u.com熱心網友回復:

有沒有用?
When a software is not responding,windows automatecaly transforms the window of that program into a ghost window.This means that the user can no longer interact with the that window.The function is FrostCrashedWindow and it is located in user32.dll.

It has the following signature:

HWND FrostCrashedWindow(HWND,HWND);

uj5u.com熱心網友回復:

參考 55 樓 schlafenhamster 的回復:
有沒有用?
When a software is not responding,windows automatecaly transforms the window of that program into a ghost window.This means that the user can no longer interact with the that window.The function is FrostCrashedWindow and it is located in user32.dll.

It has the following signature:

HWND FrostCrashedWindow(HWND,HWND);


這個和置頂關系不大,這個只是對沒有回應的視窗變成“霧化”顯示

uj5u.com熱心網友回復:

“”This means that the user can no longer interact with the that window.“”
視窗 被 凍結 !

uj5u.com熱心網友回復:

參考 57 樓 schlafenhamster 的回復:
“”This means that the user can no longer interact with the that window.“”
視窗 被 凍結 !


但我想要的是用戶仍然能夠和視窗進行互動

uj5u.com熱心網友回復:

截圖,列印在一張透明貼紙上,再貼在螢屏上!

uj5u.com熱心網友回復:

還沒新發現,這問題不一定能完美解決,主要來聽下大家意見

uj5u.com熱心網友回復:

想到的是把欲置頂視窗區域的重繪訊息處理掉

uj5u.com熱心網友回復:

參考 62樓sololie 的回復:
想到的是把欲置頂視窗區域的重繪訊息處理掉
漏了個 非  字

uj5u.com熱心網友回復:

只想問問強悍的程式開2個,肯定有一個不強悍了吧。還是定時器大法好

uj5u.com熱心網友回復:

會不會是系統對那一個表單“特殊照顧”而實作的結果呢???畢竟用真正“TOPMOST”的只能有一個,通過創建時標識或“后期”API置頂,?  那些視窗都是“平級”的,這時自然就是哪個表單擁有焦點、哪個表單就會到“最頂層”。

uj5u.com熱心網友回復:

是不是與行程 優先度有關 ,提高試試。

uj5u.com熱心網友回復:

試一下這個bat檔案:
檔案名:dead.bat
while 1:
   start
   dead
   pause
   

uj5u.com熱心網友回復:

以前想要程式全屏就碰到這個問題,,任務管理器真是強悍。

uj5u.com熱心網友回復:

據說任務管理器用的是CreateWindowInBand

uj5u.com熱心網友回復:

每個程式都想頂置。·~~都成流氓程式了。
其實我感覺 SetWindowPos 夠用。至于被其它程式遮住,一般沒什么辦法。

uj5u.com熱心網友回復:

我試過,放大鏡可以遮住任務管理器

uj5u.com熱心網友回復:

A ghost window replaces a window that hasn't called Get or PeekMessage for 5 seconds, in other words a hung window. It displays a bitmap of the hung window's client area

uj5u.com熱心網友回復:

參考 74 樓 LshSm_ 的回復:
我試過,放大鏡可以遮住任務管理器

厲害,這都被你發現了,而且這個置頂感覺也沒什么必要啊,任務管理器置頂后雖然顯示是置頂了,但是當你打開其他新視窗后,焦點已經在新打開的視窗了。

uj5u.com熱心網友回復:

onpaint的時候置頂,只要被遮蓋就會引起重繪

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/31958.html

標籤:基礎類

上一篇:有人知道fyde這個作業系統嗎?它的本質是什么?

下一篇:設計一套簡單的資料傳輸協議和心跳包,header頭部需要哪些資訊

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more