簡體   English   中英

WinAPI,ShellHook和“提示窗口” AKA(工具提示)

[英]WinAPI, ShellHook and “hint windows” AKA (tooltips)

我編寫了自己的任務欄替換,我已經愉快地使用了很多年(但是),但是有一些未解決的問題。 請幫忙! 我的任務欄中出現“提示”窗口。 當您將鼠標懸停在瀏覽器中的選項卡或某個程序中的按鈕或鏈接上時,將顯示那些(通常為黃色)窗口。 通常,一旦您移動鼠標,這些窗口就會消失,並且通常不應將它們檢測為單獨的窗口,也不應該顯示在任務欄中。 對我而言,它們通常不會關閉並永遠停留在屏幕上,直到重新啟動或部分關閉,帶有提示文字的黃色窗口消失了,但周圍的“陰影”仍然存在(有時帶有白色框)

當鼠標懸停在Chrome標簽上方時,未正確處理“提示”窗口的屏幕截圖 )。

請幫助了解如何避免將這些窗口檢測為“正常窗口”,並解釋為什么我將它們關閉。

我查看了ReactOS任務欄的源代碼,但是對我來說,它看起來與我自己的實現非常相似,我發現沒有什么明顯的區別。 所以我一定想念一些東西。 這是我使用的一些代碼:

//making taskbar window
SHELLHOOK = RegisterWindowMessageA("SHELLHOOK");
SetTaskmanWindow(prog->handle);
RegisterShellHookWindow(prog->handle);
prog->setCaption("Shell_TrayWnd");
SendMessage(prog->handle, SHELLHOOK, 0, 0);
SendMessage((void*)0xffff, tray.WM_TASKBARCREATED, 0, 0);


//enumerating windows to put into taskbar
int __stdcall enum_proc(void * H, WindowsList &L)
{
       // try to filter out unnecessary windows
     if (H == mainWindow.handle) return true;
     if (
        GetWindow(H, GW_OWNER)
        || !IsWindowVisible(H)
        || !IsWindow(H)
        || GetParent(H) != 0
     ) return true;
     str s; s.setLength(1024); // try to filter out 'tooltips' by classname or size
     s.setLength(GetClassNameA(H, *s, s.length));
     s.lower();
     if (s.pos("tooltip") >= 0) return true; //did it work? (nope)
     int S = GetWindowLong(H, GWL_STYLE);
     RECT R; GetWindowRect(H, &R); int h = R.bottom - R.top;
     //if (h > 10 && h < 30) return true; // this is not a solution sadly..
     if (S & TTS_NOPREFIX) return true;
     if (S & TTS_ALWAYSTIP) return true;
     L.addWindowHandle(H); 
     return true;
}


void get_sys_window_list(WindowsList &L)
{
   EnumWindows(enum_proc, &L);
}

我不知道您在查看ReactOS的源代碼時是如何錯過它的,但是工具提示具有WS_EX_TOOLWINDOW擴展樣式。 設置了這種樣式的Windows不應顯示在任務欄上。

ReactOS中的相關行

關於以下問題:

周圍的“陰影”保持不變

我不明白這與問題有何關系。 您已附上了Chrome的屏幕截圖。 這是否意味着您的任務欄以某種方式導致工具提示的陰影停留在屏幕上?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM