日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實戰(zhàn)洞察。

Windows托盤氣球通知無效排查:Shell_NotifyIcon字段與系統(tǒng)策略

Windows托盤氣球通知無效排查:Shell_NotifyIcon字段與系統(tǒng)策略 托盤圖標(biāo)出現(xiàn)在任務(wù)欄右下角右鍵菜單響應(yīng)正常雙擊也能喚出主窗口唯獨(dú)調(diào)Shell_NotifyIcon發(fā)出去的那個氣球通知屏幕上一點(diǎn)動靜都沒有——而且返回值還是TRUE。這個現(xiàn)象我前后遇到過三四回每次根因都不一樣有一次是uFlags漏了NIF_INFO有一次是程序被改成后臺常駐方式導(dǎo)致圖標(biāo)壓根沒掛到 explorer 上還有一次是測試機(jī)上把通知和操作的總開關(guān)關(guān)掉了。所以看到氣球通知無效這種描述先別急著翻代碼得先把無效這兩個字拆開判斷它到底屬于哪一類。這篇是寫給正在做 Windows 桌面端常駐托盤程序的人看的以 CWin32為主順帶把 C#WinForms和 WPF 封裝層上的等價坑一起擺出來。讀完至少能做到兩件事一是清楚Shell_NotifyIcon發(fā)氣泡時到底是哪幾個字段在起作用二是手上有一套能自己往下查的鏈路而不是對著屏幕干瞪眼改參數(shù)。氣球通知這東西看著只有幾行 API實際上牽扯到結(jié)構(gòu)體版本、字符集、窗口消息循環(huán)、系統(tǒng)通知策略、會話隔離五個層面任何一層出問題表現(xiàn)都是沒反應(yīng)所以分層定位比試錯重要得多。1. 三種不彈故障點(diǎn)完全不同1.1 圖標(biāo)壓根沒進(jìn)托盤區(qū)這是最容易被跳過的一步。很多人在排查氣泡的時候默認(rèn)圖標(biāo)都在那兒了肯定是氣泡的問題但實際情況里圖標(biāo)顯示正常并不代表NIM_ADD成功過——有一種情況是圖標(biāo)顯示出來了但那是上一次進(jìn)程殘留的僵尸圖標(biāo)鼠標(biāo)劃過就消失點(diǎn)它也沒反應(yīng)。真正判斷圖標(biāo)是否屬于當(dāng)前進(jìn)程最簡單的辦法是把鼠標(biāo)懸停在圖標(biāo)上看szTip里設(shè)置的提示文字有沒有出現(xiàn)如果提示文字是空白的或者顯示的是別的程序的文字那基本可以確定當(dāng)前進(jìn)程根本沒加上圖標(biāo)氣泡自然無從談起。NIM_ADD失敗的原因里hIcon為空是最常見的一個。Win32 里常見寫法是先LoadIcon或者LoadImage拿一個HICON再填進(jìn)nid.hIcon。這里有個真實存在的坑如果這個HICON是通過CreateIconIndirect、CopyIcon這類函數(shù)動態(tài)生成的而代碼里又在NIM_ADD之后順手調(diào)了DestroyIcon托盤圖標(biāo)會立刻變成一塊空白或者花屏。原因是 shell 并沒有把圖標(biāo)數(shù)據(jù)拷貝走它只是持有了這個句柄你銷毀了它那邊就指向了一塊已經(jīng)失效的內(nèi)存。正確的釋放時機(jī)是NIM_DELETE之后再DestroyIcon順序不能反。還有一種更隱蔽的程序被注冊成了服務(wù)或者用計劃任務(wù)以不管用戶是否登錄都運(yùn)行的方式啟動。這種進(jìn)程運(yùn)行在會話 0Session 0而會話 0 是沒有交互式桌面的Shell_NotifyIcon可能返回成功圖標(biāo)卻永遠(yuǎn)不可能出現(xiàn)在用戶眼前。判斷方法很簡單任務(wù)管理器里看這個進(jìn)程屬于哪個會話如果不是當(dāng)前登錄用戶的會話號那所有 UI 相關(guān)的 API 都是白搭。另外提一句Windows 11 的托盤區(qū)把默認(rèn)圖標(biāo)折疊進(jìn)了溢出面板用戶不點(diǎn)開小箭頭是看不到的。這不是故障但排查時容易被誤判成圖標(biāo)沒加進(jìn)去先確認(rèn)一下托盤設(shè)置里的隱藏的圖標(biāo)菜單。1.2 圖標(biāo)在氣泡死活不出來這一類才是標(biāo)題里說的情況。此時NIM_ADD是成功的szTip能正常顯示右鍵菜單也能彈唯獨(dú)氣泡不出來。常見原因按出現(xiàn)頻率排下來大概是uFlags沒帶NIF_INFO、NIM_MODIFY之前圖標(biāo)狀態(tài)已經(jīng)丟了、szInfo為空字符串、系統(tǒng)通知開關(guān)被關(guān)閉、發(fā)送氣泡時消息循環(huán)處于阻塞狀態(tài)。uFlags這個問題我在代碼評審里見過不止一次。有人寫了一個UpdateTrayIcon()函數(shù)把NIF_ICON | NIF_MESSAGE | NIF_TIP全填上然后在這個函數(shù)末尾順手填了szInfo和szInfoTitle以為這樣氣泡就會跟著圖標(biāo)一起更新。實際上Shell_NotifyIcon是嚴(yán)格按uFlags位掩碼來決定讀哪些字段的沒置NIF_INFO位szInfo那一段內(nèi)存它連看都不看。同理dwInfoFlags的圖標(biāo)類型、NIIF_NOSOUND這類標(biāo)志也都只在NIF_INFO置位時才生效。還有一種是先刪后沒加。某些程序在響應(yīng)WM_ENDSESSION或者顯示器的WM_DISPLAYCHANGE時會先NIM_DELETE再重新NIM_ADD如果中間某次NIM_ADD因為窗口句柄無效而失敗后續(xù)的NIM_MODIFY就會一直返回失敗氣泡當(dāng)然也發(fā)不出來。所以我習(xí)慣把是否已添加做成一個顯式的狀態(tài)位任何一次NIM_ADD失敗都要記錄下來后續(xù)發(fā)氣泡前先檢查這個狀態(tài)。1.3 氣泡彈了但標(biāo)題是空的或者全是亂碼嚴(yán)格來說這不算無效但它經(jīng)常和無效混為一談因為用戶看到一片方塊或者空白會直接反饋通知沒顯示。亂碼的根因幾乎只有一個結(jié)構(gòu)體用了 ANSI 版本而字符串傳的是寬字符或者反過來。NOTIFYICONDATA在 SDK 頭文件里是通過UNICODE宏展開成NOTIFYICONDATAW或NOTIFYICONDATAA的如果工程屬性里的字符集是使用多字節(jié)字符集而你代碼里寫的是L...編譯器要么報錯要么悄悄截斷最終szInfo里只有一個字符加個結(jié)尾。這個坑在遷移老項目時特別容易踩到。老工程當(dāng)年是 MBCS后來為了支持多語言整體改成 Unicode結(jié)果某個自己封裝的托盤類里還留著char緩沖區(qū)和新結(jié)構(gòu)體拼接編譯能過跑起來就是亂碼。定位辦法是直接看sizeof(NOTIFYICONDATA)的值Unicode 版本在 x64 下大概是 976 字節(jié)這個量級如果在調(diào)試器里看到cbSize明顯偏小那基本就是字符集或者結(jié)構(gòu)體定義對不上。2. NOTIFYICONDATA 里決定氣泡生死的字段2.1 uFlags、szInfo、szInfoTitle 三者的聯(lián)動關(guān)系先把一段能用的代碼擺出來后面所有的討論都圍繞它展開。下面這段是添加圖標(biāo)的初始化注意uFlags里沒有NIF_INFO因為添加階段不需要?dú)馀軳OTIFYICONDATA nid { 0 }; nid.cbSize sizeof(NOTIFYICONDATA); nid.hWnd hMainWnd; nid.uID IDI_TRAY; nid.uFlags NIF_ICON | NIF_MESSAGE | NIF_TIP; nid.uCallbackMessage WM_TRAY_CALLBACK; nid.hIcon hTrayIcon; StringCchCopy(nid.szTip, ARRAYSIZE(nid.szTip), L常駐托盤工具); if (!Shell_NotifyIcon(NIM_ADD, nid)) { // 這里一定要留日志后面排查全靠它 }發(fā)氣泡是另一段獨(dú)立邏輯uFlags只保留NIF_INFObool ShowBalloon(HWND hWnd, UINT id, const wchar_t* title, const wchar_t* text, DWORD infoFlags) { NOTIFYICONDATA nid { 0 }; nid.cbSize sizeof(NOTIFYICONDATA); nid.hWnd hWnd; nid.uID id; nid.uFlags NIF_INFO; nid.dwInfoFlags infoFlags; StringCchCopy(nid.szInfoTitle, ARRAYSIZE(nid.szInfoTitle), title); StringCchCopy(nid.szInfo, ARRAYSIZE(nid.szInfo), text); return Shell_NotifyIcon(NIM_MODIFY, nid) ! FALSE; }這里有兩個細(xì)節(jié)值得說。第一NIM_MODIFY階段uFlags只寫NIF_INFO是完全正確的語義是這次我只改氣泡部分其它字段別動不需要把NIF_ICON再寫一遍。第二szInfo傳空字符串注意不是空指針是長度為 0 的字符串的語義是移除當(dāng)前顯示的氣泡不是什么都不做。有些代碼在錯誤分支里填了個空字符串當(dāng)兜底結(jié)果就是看起來什么都沒發(fā)生。字段長度也有硬上限szInfo是 256 個WCHARszInfoTitle是 64 個WCHAR都包含結(jié)尾的空字符。超長會被截斷用StringCchCopy這類安全函數(shù)能保證不出界但內(nèi)容確實會丟。我見過標(biāo)題寫了一長串路徑導(dǎo)致后面全被切掉的看起來像標(biāo)題顯示不全其實是長度超限。2.2 cbSize、uVersion 與那個共用體的歷史包袱cbSize是所有NOTIFYICONDATA故障里最隱蔽的一個。這個字段的用途是讓 shell 知道調(diào)用方用的是哪個版本的結(jié)構(gòu)體因為從 Windows 2000 到現(xiàn)在這個結(jié)構(gòu)體加過好幾輪字段。寫sizeof(NOTIFYICONDATA)在正常情況下永遠(yuǎn)是對的問題出在兩種場景一是工程引用了很老的第三方 SDK 頭文件結(jié)構(gòu)體定義本身就缺字段sizeof算出來偏小二是用 C# 或其它語言手工定義StructLayout時字段漏了或者順序錯了。第二種場景我踩過。C# 里為了不依賴 WinForms 的NotifyIcon有人會自己DllImport一個Shell_NotifyIcon然后手寫一個NOTIFYICONDATA結(jié)構(gòu)體。少寫一個guidItem或者把uTimeout的位置寫錯編譯一點(diǎn)問題沒有運(yùn)行起來cbSize對不上NIM_ADD直接返回FALSE。這種情況在調(diào)試器里看一眼cbSize和預(yù)期值差多少基本就能定位。再說uVersion。NOTIFYICONDATA里uTimeout和uVersion是共用同一塊內(nèi)存的union { UINT uTimeout; UINT uVersion; };也就是說你不能在同一次調(diào)用里既設(shè)超時又設(shè)版本號。設(shè)置版本要用NIM_SETVERSION把uVersion填成NOTIFYICON_VERSION_4這個動作會改變后續(xù)回調(diào)消息的編碼方式——lParam的低字是消息 ID高字是圖標(biāo) ID。很多人加了NIM_SETVERSION之后發(fā)現(xiàn)右鍵菜單不彈了就是因為回調(diào)處理還在按老格式解析lParam。所以這條命令不是加了更好而是加了就得改回調(diào)。NOTIFYICON_VERSION_4還有另一個副作用uTimeout被徹底忽略氣泡停留時長完全由系統(tǒng)的輔助功能設(shè)置決定。如果你有代碼依賴精確控制氣泡顯示 3 秒還是 10 秒那在 v4 下是做不到的。2.3 dwInfoFlags 里幾個會反向生效的標(biāo)志dwInfoFlags決定氣泡左側(cè)那個小圖標(biāo)的樣式常見取值是NIIF_NONE、NIIF_INFO、NIIF_WARNING、NIIF_ERROR、NIIF_USER。前四個都是系統(tǒng)內(nèi)置圖標(biāo)直接寫就行NIIF_USER則需要額外配合hBalloonIcon字段。這里有個真實的坑NIIF_USER置位但hBalloonIcon留空時不同 Windows 版本的處理不一致有的版本回退到hIcon有的版本干脆畫一個默認(rèn)圖標(biāo)還有的版本會導(dǎo)致整個氣泡不顯示。我現(xiàn)在的做法是要么不用NIIF_USER用就老老實實把hBalloonIcon填上別指望系統(tǒng)幫你兜底。另一個有意思的標(biāo)志是NIIF_RESPECT_QUIET_TIMEWindows 7 引入的。置位之后如果系統(tǒng)處于安靜時間現(xiàn)在叫專注助手這條氣泡會被直接丟棄不是延遲顯示是丟棄。這個標(biāo)志的設(shè)計初衷是尊重用戶不想被打擾的意愿但如果你的程序發(fā)的是關(guān)鍵提醒置了這個位就等于主動放棄了顯示機(jī)會。反過來如果你不置這個位系統(tǒng)在某些版本上仍然會按全局策略抑制橫幅——這一點(diǎn)各版本行為不完全一致所以不要用它來做能不能顯示的開關(guān)。NIIF_NOSOUND相對簡單加上就不響提示音。有個細(xì)節(jié)是它不影響氣泡本身的顯示只影響聲音所以別把它和靜音模式下氣泡不顯示混為一談。3. 代碼沒問題但屏幕沒反應(yīng)系統(tǒng)層攔在哪3.1 通知總開關(guān)、專注助手與安靜時間這是排查時最容易漏掉的一層因為它不在你的代碼里而在用戶的機(jī)器上。Windows 10 之后系統(tǒng)設(shè)置里有一個通知和操作的總開關(guān)關(guān)掉之后所有應(yīng)用的通知全部靜默下面還有按應(yīng)用細(xì)分的開關(guān)以及專注助手的幾種模式關(guān)閉、僅優(yōu)先通知、僅鬧鐘。Shell_NotifyIcon發(fā)出的氣泡在 Windows 8 之后已經(jīng)被系統(tǒng)當(dāng)作通知來管理了所以它會完整地受這些開關(guān)影響。表現(xiàn)是Shell_NotifyIcon返回TRUE氣泡不出現(xiàn)通知中心里也找不到。這種情況你改一萬行代碼都沒用。排查手段是讓測試機(jī)恢復(fù)到默認(rèn)狀態(tài)通知總開關(guān)打開、專注助手關(guān)閉、當(dāng)前應(yīng)用在通知列表里處于允許狀態(tài)。還有一點(diǎn)如果程序以管理員權(quán)限運(yùn)行而系統(tǒng)設(shè)置里的通知是按應(yīng)用配置的某些版本下管理員進(jìn)程的通知配置和普通進(jìn)程不是同一份表現(xiàn)就是普通權(quán)限下能彈、提權(quán)后不彈。這個差異在不同系統(tǒng)版本上表現(xiàn)不一致我的做法是測試矩陣?yán)锕潭ò胀?quán)限和管理員權(quán)限兩行別只測一種。老系統(tǒng)上還有一個注冊表開關(guān)HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced下的EnableBalloonTips值為 0 時禁用氣球提示。這個鍵在新系統(tǒng)上是否仍然生效取決于版本但在 Windows 7 時代它是標(biāo)準(zhǔn)的關(guān)閉方式排查老環(huán)境時值得看一眼。組策略里也有對應(yīng)的關(guān)閉通知?dú)馇蛱崾卷椨颦h(huán)境下的機(jī)器可能被統(tǒng)一下發(fā)。3.2 會話與用戶身份Session 0 和 RunAs 的死角前面提過會話 0 的問題這里展開說。Windows 的服務(wù)宿主機(jī)制決定了服務(wù)進(jìn)程運(yùn)行在會話 0那是一個沒有交互式桌面的獨(dú)立會話。任何在會話 0 里調(diào)用的 UI 相關(guān) API包括Shell_NotifyIcon、MessageBox、CreateWindow要么失敗要么創(chuàng)建一個用戶永遠(yuǎn)看不到的窗口。這個問題在實際項目里通常表現(xiàn)為開發(fā)機(jī)上好好的裝到客戶機(jī)上就沒通知。區(qū)別在于開發(fā)機(jī)是雙擊 exe 運(yùn)行的客戶機(jī)上是通過服務(wù)或者計劃任務(wù)啟動的。定位方法是在任務(wù)管理器里加一列會話 ID看進(jìn)程對應(yīng)的數(shù)字是不是和當(dāng)前登錄用戶一致。如果不一致那問題不在代碼在于部署方式——要么改成用戶登錄后自啟動要么用會話隔離機(jī)制把 UI 部分拆成一個運(yùn)行在用戶會話里的獨(dú)立進(jìn)程。還有一種情況是以另一個用戶身份運(yùn)行比如右鍵以其他用戶身份運(yùn)行或者用憑據(jù)管理器啟動。這時圖標(biāo)會加到那個用戶的托盤里當(dāng)前登錄用戶看不到但那個用戶如果同時在線快速用戶切換在他自己的桌面里是能看到圖標(biāo)的?,F(xiàn)象就是我這邊沒圖標(biāo)但換個賬號登錄就有了很容易被誤判成偶發(fā) bug。3.3 Windows 8 之后氣球改頭換面成 Toast這條屬于知道就行不知道會繞遠(yuǎn)路的范疇。從 Windows 8 開始Shell_NotifyIcon發(fā)出的氣球通知在視覺上已經(jīng)變成了 toast 樣式——從屏幕右下角滑入、停留幾秒、然后收進(jìn)通知中心。接口沒變樣式變了。這個變化帶來兩個實際影響。第一通知中心會成為這些氣泡的歸檔地用戶在通知中心里能看到歷史消息這意味著重復(fù)發(fā)同一條消息的行為和老系統(tǒng)不一樣了老系統(tǒng)上重復(fù)發(fā)會不斷彈新的新系統(tǒng)上可能出現(xiàn)合并或者覆蓋。第二某些系統(tǒng)版本上如果程序沒有設(shè)置AppUserModelID通知在系統(tǒng)里的歸屬會是一個默認(rèn)的宿主表現(xiàn)是通知列表里看不到你的應(yīng)用名用戶在設(shè)置里想允許你的通知都找不到對應(yīng)條目。設(shè)置AppUserModelID的 API 是SetCurrentProcessExplicitAppUserModelID在進(jìn)程啟動早期調(diào)用。如果對通知的可靠性要求比較高其實可以考慮直接走 Toast 通知那套接口代價是需要注冊快捷方式、需要處理激活回調(diào)工程復(fù)雜度上一個臺階。托盤氣球勝在簡單二十行代碼就能跑Toast 勝在可控能拿到點(diǎn)擊、能進(jìn)通知中心歸檔、能被用戶精細(xì)管理。選哪個取決于你的通知是順手提示一下還是業(yè)務(wù)流程的一環(huán)。4. 一條能自己走完的排查鏈路4.1 用三十行最小工程把業(yè)務(wù)代碼摘出去我處理這類問題的固定第一步是新建一個空的 Win32 工程只保留一個隱藏主窗口、一個托盤圖標(biāo)、一個定時器定時器每三秒發(fā)一次氣泡。這個工程大概三十行寫完不超過十分鐘。之所以要先做這一步是因為在真實項目里氣泡不顯示可能是業(yè)務(wù)邏輯、線程調(diào)度、窗口生命周期三者疊加出來的你直接在里面改參數(shù)改一次跑一次變量太多判斷不了哪個改動起了作用。最小工程的骨架大致是這樣LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CREATE: AddTrayIcon(hWnd); SetTimer(hWnd, TIMER_BALLOON, 3000, nullptr); return 0; case WM_TIMER: if (wParam TIMER_BALLOON) { ShowBalloon(hWnd, IDI_TRAY, L測試標(biāo)題, L這是一條測試氣泡, NIIF_INFO); } return 0; case WM_DESTROY: RemoveTrayIcon(hWnd); PostQuitMessage(0); return 0; } return DefWindowProc(hWnd, msg, wParam, lParam); }如果這個最小工程能彈氣泡說明 API 用法和系統(tǒng)環(huán)境都沒問題問題在你的業(yè)務(wù)代碼里如果彈不出來說明問題在環(huán)境或者調(diào)用方式上接下來往系統(tǒng)層查。這一步能省掉一半的排查時間。4.2 返回值、窗口消息、監(jiān)視工具三處取證最小工程也不彈的時候取證要分三路走。第一路看返回值。Shell_NotifyIcon返回FALSE說明 shell 明確拒絕了這時基本可以鎖定字段錯誤cbSize不對、hWnd無效、uID沖突。返回TRUE但無顯示說明接收端沒問題問題在展示端系統(tǒng)策略、會話、桌面可見性。這兩條分支的排查方向完全相反所以返回值必須看。第二路看窗口消息。如果要做氣泡點(diǎn)擊響應(yīng)uCallbackMessage指定的消息會在氣泡被點(diǎn)擊時發(fā)到你的窗口。用一個能抓窗口消息的工具掛在目標(biāo)窗口上觀察發(fā)氣泡前后有沒有WM_USER范圍內(nèi)的消息流動。這一步主要是確認(rèn) shell 到底有沒有收到請求。第三路看系統(tǒng)狀態(tài)。通知設(shè)置、專注助手、會話 ID、是否提權(quán)這四項各花一分鐘確認(rèn)比讀一天文檔有用。我現(xiàn)在的習(xí)慣是在程序的關(guān)于頁面里放一個隱藏的診斷入口一鍵打印這幾項狀態(tài)客戶反饋問題時讓他截個圖能省掉好幾輪來回?,F(xiàn)象優(yōu)先懷疑驗證方式NIM_ADD返回 FALSEcbSize、hIcon為空、窗口句柄無效調(diào)試器里看cbSize與sizeof是否一致圖標(biāo)在氣泡無返回值 TRUEuFlags漏NIF_INFO斷點(diǎn)檢查發(fā)送時的uFlags值圖標(biāo)不在氣泡無會話 0、圖標(biāo)句柄被提前釋放任務(wù)管理器看會話 ID檢查DestroyIcon時機(jī)氣泡出但標(biāo)題空白字符集不匹配看sizeof(NOTIFYICONDATA)與工程字符集設(shè)置時好時壞消息循環(huán)被阻塞、定時器被搶占檢查主線程是否有長耗時同步操作特定機(jī)器必現(xiàn)通知開關(guān)、專注助手、組策略重置通知設(shè)置為默認(rèn)后復(fù)測4.3 把什么時候不彈記錄成日志這一點(diǎn)聽起來平淡但它決定了后續(xù)排查是幾天還是幾小時。我在托盤模塊里加了一組固定的日志點(diǎn)NIM_ADD的結(jié)果、NIM_DELETE的結(jié)果、每次發(fā)氣泡前的uFlags和dwInfoFlags值、發(fā)氣泡的返回值、當(dāng)前進(jìn)程的會話 ID 和是否提權(quán)。這些信息加起來不到二十行代碼但客戶現(xiàn)場出問題時看一眼日志就能把范圍縮小到一兩個方向。有個細(xì)節(jié)日志里不要把szInfo全文打進(jìn)去用戶數(shù)據(jù)可能很長也可能包含不該落盤的內(nèi)容打個長度和標(biāo)題就夠了。5. 托管封裝層WinForms 與 WPF 的等價坑5.1 NotifyIcon.ShowBalloonTip 的前置條件C# 的 WinForms 里NotifyIcon類把Shell_NotifyIcon包了一層接口看著簡單坑一樣不少。ShowBalloonTip(int timeout)要能生效至少得滿足三個條件Visible為true、Icon不為null、圖標(biāo)已經(jīng)被系統(tǒng)接受。第一個條件是硬性的Visible false時調(diào)ShowBalloonTip不拋異常也不顯示最容易漏。第二個條件很多人以為只要給Icon賦值就行實際上如果你是從資源文件動態(tài)加載圖標(biāo)流用完順手把StreamDispose掉了Icon對象的內(nèi)部句柄可能已經(jīng)失效表現(xiàn)就是托盤圖標(biāo)顯示成一塊空白氣泡也跟著不顯示。第三個條件在窗體生命周期早期容易出問題。在Form_Load里立刻調(diào)ShowBalloonTip有些機(jī)器上不生效因為這時窗口句柄剛創(chuàng)建托盤圖標(biāo)還沒真正掛上去。穩(wěn)妥做法是Load之后用BeginInvoke推遲到消息隊列下一輪再調(diào)或者在Shown事件里調(diào)。timeout參數(shù)在 Vista 之后基本被忽略了實際時長由系統(tǒng)的輔助功能設(shè)置決定。這一點(diǎn)和老系統(tǒng)不一樣如果產(chǎn)品文檔里寫了氣泡顯示 5 秒最好改成約 5 秒實際由系統(tǒng)設(shè)置決定免得后面被當(dāng)成 bug 提。5.2 消息泵被堵住時氣泡會遲到Shell_NotifyIcon內(nèi)部是通過窗口消息和任務(wù)欄通信的這意味著它依賴調(diào)用線程的消息循環(huán)。如果主線程正在跑一個長耗時同步任務(wù)比如讀一個大文件、等一個網(wǎng)絡(luò)請求、跑一段密集計算那么即使你在另一個線程里調(diào)ShowBalloonTip調(diào)用也可能被卡住直到主線程的消息泵重新轉(zhuǎn)起來。現(xiàn)象很有迷惑性日志顯示已發(fā)送氣泡但用戶是在幾秒甚至幾十秒之后才看到或者干脆看不到因為已經(jīng)過了時效。這類問題在后臺任務(wù)完成時彈通知的場景里特別常見因為后臺任務(wù)完成的時刻主線程往往正在刷新界面。處理辦法是有的把耗時任務(wù)放到后臺線程主線程只負(fù)責(zé) UI或者在不依賴NotifyIcon對象的場景下用一個獨(dú)立的隱藏窗口在自己的線程里跑消息循環(huán)來處理托盤消息。后者工程量大些但如果托盤邏輯要脫離主窗口獨(dú)立存活比如主窗口可以關(guān)閉但程序不退出這個結(jié)構(gòu)反而更清晰。WPF 這邊沒有內(nèi)置的托盤圖標(biāo)控件社區(qū)里常見的做法是引用 WinForms 的NotifyIcon或者用第三方庫。第三方庫如果自己實現(xiàn)了Shell_NotifyIcon的互操作那前面說的cbSize、uFlags、字符集三件事依然適用換語言不換原理。選庫的時候可以看一眼它有沒有處理NOTIFYICON_VERSION_4沒處理的話右鍵菜單的坐標(biāo)計算在某些機(jī)器上會偏。6. 把這套東西做成不容易再出問題的結(jié)構(gòu)6.1 用一個帶狀態(tài)位的發(fā)送函數(shù)收口在項目里我最后的做法是把托盤的添加刪除發(fā)氣泡三個動作集中在一個小模塊里模塊內(nèi)部維護(hù)一個bool added狀態(tài)位任何一次NIM_ADD成功才置位NIM_DELETE后清零。發(fā)氣泡的入口函數(shù)第一件事就是檢查這個狀態(tài)位沒置位就先嘗試添加一次。這樣不管上層怎么調(diào)用都不會出現(xiàn)圖標(biāo)沒了還在發(fā)氣泡的靜默失敗。同時這個模塊對外只暴露一個ShowBalloon(title, text, level)函數(shù)level是個枚舉映射到NIIF_INFO、NIIF_WARNING、NIIF_ERROR。這樣上層不需要知道dwInfoFlags的存在后面如果要換實現(xiàn)比如換成 Toast 通知改動面只在一個文件里。還有一個小設(shè)計發(fā)氣泡函數(shù)返回一個枚舉區(qū)分發(fā)送成功、發(fā)送失敗、系統(tǒng)策略可能抑制三種結(jié)果。第三種判斷不了那么準(zhǔn)可以根據(jù)會話 ID 和通知開關(guān)做個粗略推斷。有這個返回值上層在做關(guān)鍵提醒時就能選擇走別的通道比如閃爍任務(wù)欄、改托盤圖標(biāo)顏色而不是把所有希望都押在氣泡上。6.2 退出時的清理和僵尸圖標(biāo)NIM_DELETE一定要在窗口銷毀之前調(diào)而且要用和NIM_ADD完全相同的hWnd和uID。我見過填錯uID導(dǎo)致圖標(biāo)刪不掉的情況表現(xiàn)是程序退出后圖標(biāo)還掛在那兒鼠標(biāo)劃過才消失。這不僅僅是觀感問題——?dú)埩舻膱D標(biāo)會占用那個uID下次啟動如果復(fù)用同一個 ID行為可能不可預(yù)期。另一個清理時機(jī)是WM_ENDSESSION系統(tǒng)關(guān)機(jī)或者注銷時程序不一定能走完正常的退出流程。在這個消息里補(bǔ)一次NIM_DELETE能減少殘留。還有崩潰場景進(jìn)程直接掛掉不會執(zhí)行任何清理代碼圖標(biāo)一定殘留這個沒辦法只能靠系統(tǒng)自己回收。如果程序支持多實例uID的分配要小心。兩個實例用同一個hWnd和uID是不可能的hWnd天然不同但如果用了自己生成的guidItem標(biāo)識兩個實例可能會互相覆蓋。多實例場景建議用單實例機(jī)制直接禁掉或者在guidItem里加入進(jìn)程相關(guān)的區(qū)分信息。6.3 版本差異下的降級策略不同 Windows 版本對氣泡的處理差異實際項目里沒必要逐一適配但有三條底線值得守住。第一條不要在NIM_ADD的時候一次性把NIF_INFO也帶上試圖順便彈個氣泡添加和修改分成兩次調(diào)用邏輯清晰出問題也好定位。第二條NIM_SETVERSION只在確實需要 v4 的回調(diào)格式時才調(diào)調(diào)了就同步改回調(diào)解析邏輯兩者必須一起改。第三條uTimeout不要依賴需要多停留一會兒的需求用重復(fù)發(fā)送或者改成帶交互的通知來實現(xiàn)更好別指望這個字段。我在實際項目里的體會是托盤氣泡這個功能的問題密度和代碼量完全不成比例——二十行代碼的功能可能需要幾百行的排查經(jīng)驗來兜底。所以能把它封裝干凈就封裝干凈別讓業(yè)務(wù)邏輯直接碰NOTIFYICONDATA后面換人維護(hù)或者系統(tǒng)升級改一個文件就夠了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
肥臀熟女福利视频一区二区| 天天插天天操| 情色五月天就去干| 强奸熟女一区二区三区| 欧美成人亚洲精品| www色色色com| 久久综合激情| 97精品国产97久久久久久| 中文字幕一区电影在线观看| 翔田千里AV无码秘 三区| 男女香蕉一区二区| 色九九九九| 人人色人人操在线| 免費黃色視頻觀看一| 人人操人人摸人人看人人干| 中文字幕精品探花视频| 青青操在线视频| daxiangjiao你懂的| 超碰亚洲97| 国产亚州高清国产拍精| 欧美一区二区一级岛国大片| 高清在线不卡一区二区 视频| 99re9| AV女优男人的天堂| 東南亚性呦成人伦理资源在线视频| 亚洲天堂第一页| 五月丁香在线| 久久熟女人| 婷婷久久五月天| 日韩精品在线观看网站| 国产女人操逼视频| 国产18精品亚洲精品| 亚洲一卡2卡3卡4卡乱码网站 | 国产精品 视频| 在线日韩日本亚洲国产| 免费1级a做爰片观看| 在线视频亚洲无码| 狼狼色丁香久久婷婷综合五月| 亚洲加勒比久久日本道| 国产呦精品系列在线观看| 色九久| 久久精品国产97欧美精品亚洲 | 免费观看一区| 久久黄片国产一区二区| 加勒比在线观看一区二区| 亚欧毛片基地国产毛片基地| 国产在线激情视频| av大香蕉| 91久久精品国产| 亚洲熟妇丝袜在线观看| 青娱乐大香蕉| 综合激情一一91| 夜夜精品视频一区二区| 日韩情色一区二区| 岛国片在线播放| 日日操免费视频| 岛国大片在线观看网站入口| 99999无码| 哈哈操电影AV| 中文字幕在线第二页| 色香综合天天影视综合 | 4tube欧美女厕所| 欧亚三区动漫| 三级精品三级在线观看| 国产激情片在线观看| 五月婷婷六月丁香| 国产亚卅97| 亚洲天堂久| 国产精品福利视频| 日韩国产乱子伦App| 综合久久欧美| 91处女视频在线观看| 日韩欧美性爱电影在线观看| 国产亲戚伦亲在线| 蜜桃精品视频一区| 日韩在线一区高清在线| 成人 日韩欧美一区| 欧美九九爱| 男人的天堂无码| 啊啊啊啊啊在线| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 秋霞一集毛片观看| 久久久精品成人国产| 欧美色棕合| 老鸭窝日丰县女人| 肏逼视频日本| 婷婷六月色| 欧美猛交黑寡妇中文字幕| 中文字幕第95页| 国产精品久久久吖| 青青草操逼逼视频| 亚洲天堂2020| 四虎影院成年人片| 午夜精品久久999热蜜桃介男人用| 蜜桃天美传媒AV一区二区三区| 亚洲欧洲自拍图片专区满春格 | 欧美淫乱视频| 6080YYY午夜理论片在线观看| 91精品大奶人妻| 亚洲日韩久久精品一区| 蜜乳性色无码专日粉嫩骚逼AV| 日本三级久| 日韩色女精品| 精品欧美А∨无码黑人大荫蒂| 99热综合| 密臀视频三区免费网站| 人人做人人妻人人夜视频| 日韩9999| 亚欧无码在线| 日本一二三免费久久| 国产人妖视频一区在线观看| 91精品婷婷国产综合久久竹菊| 亚洲天天操| 激情五月综合网| 日韩有码中文字幕女同性恋| 国产成人无码网站在线视频| 一本大道青青| 99这里都是精品| 伊人久久AV诱惑悠悠| 免费强奸av| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 男人的天堂kva| 国产欧美日韩精品中文| 18禁久久| 丁香激情网| 激情另类激情| 色九九九九久| 中文字幕av亚洲精品| 国产精品一区人妻精品阁在线| 人人澡人人澡人人| 丁香六月婷婷久久综合| 欧美第二页| 日日夜夜骚| 日婷婷| 中文字幕免费观看| 麻花传媒免费网站在线观看| 欧美精品三区| 成人天天爽| 婷婷天堂站| 性感美女91影视| 长长久久曰曰夜夜成人网| 国产9区| 啊嗯好大视频在线观看| 国产精品成人福利在线| 欧美后入式| 亚洲欧美精品一区天堂久久| 久久精品欧美一区二区三区不卡| 久久综合av| 免费a在线播放v| 94色色电影网| 国产又大又粗又长视频在线| 国产精品自在线发布| 亚洲国产亚洲天堂| 欧美亚洲国内自拍| 国产成年免费大片黄在线观看| 97精品久久久久中文字幕| 无码日韩网站| 亚洲国产一级黄色视频| 香蕉免费一区二区三区不读| 日本超碰在线国产一区| 国产操伦| 国产精品天堂| 婷婷香网站| 无遮挡猛进视频免费无限观看| 97欧美综合| 亚洲一二三| 综合自拍| 中文字幕AV片| 禁片 高清 在线观看视频网站| 色视频蜜乳| 欧美特黄视频网站| 久久最新视频免费观看| 色婷婷五月天| 久久一区二区高清免费| 亚洲啪啪综合?v一区综合精品区| 亚洲九九视频| 五十路人妻在线| 久久欧美按摩999| 美女操逼福利视频| 国产精品爱欲| 91 欧美| 亚洲人综合| 偷拍亚洲高清图片| 色综合久| 色综合色| 曰韩成人免费视频| 国产一区二区精品久久99| 天天综合官网| 国内外内射高清视频| 国产99999久久精品| 欧中日成人免费影视| 91色婷婷综合久久中文字幕二区| 亚洲最新av无码成人精品区| 呦呦影院| 免费a级毛片av无码久久精品中文字幕| 91日日夜夜| 台湾佬中文娱乐自偷自拍| 九热视频| 天天噜| 日日玩天天干| 综合亚州欧美| 0755午夜福利视频| 超碰97国产欧美| 另类欧美| 亚洲色棕合| 色眯眯av| 亚洲偷91色| 欧美大干日韩| 99精品久久久久久| 欧美天天在线| 91日韩网站| 天天综合91入口| 亚洲欧美综合网站| 九九热午夜欧亚国产视频| 99国产精品久久久久久久成人热| 97 超碰 人人做 人人爱| 熟妇人妻一区二区| 午夜福利久久久噜久噜久久综合| 人人污日韩一区二区| 99热这里只有精| 天天流夜夜操| 免费的av网| 亚洲成人精品久久久| 欧美曰韩国产精品| 劲爆欧美人妖三区91| 久湿久久 | 久久激情五月| 天美av在线观看| 精品一区96| 9999亚洲电影| 综合少妇网| www色婷婷| 国产免费一区二区在线A片视频| 久草五月| 综合激情97 | 欧美国产精品久久九九| 久久久亚洲欧美综合| 日本性爱少妇| 亚洲有薄码区日本系列中文字幕| 婷婷精品国产一区二区三区日韩| 天欧美在线| 久热最新在线杭州| 收看日本人日bb| 欧美性爱中文字幕无线码| 在线国产一区二区av| 激情五月综合网| 免费看污网站| 欧在线一二区| 操操逼操操逼操操逼逼| av大香蕉| 日本最新1区2区3区| 九九九九亚洲| 欧美αv.com| 国产动漫操逼视频| 亚洲成人妻日韩在线| 中字一区| 日本午夜操逼| 久久久久久久久九九久孕交| 超碰色图| 强奸乱伦av电影| 96爱综合| 婷婷综合伊人一区| 成人国产精品三级A片| 一区黄二区黄| 男同专区一区二区三区在线| 婷婷五月天激情网| 日韩国产十八禁| 97久久超碰国产精品| 91亚洲色人| 欧美亚洲综合色| 性交一区二区在线播放| 18禁止看精品中文字幕| 狠狠穞A片一區二區三區| 国产传媒一区日韩| 成人五月天丁香激情综合| 日韩午夜啪啪视频| 欧亚揄拍偷拍精品视频| 午夜电影在线观看无码专区| 嗯嗯,好大,好爽,好骚| 九九九九九九九九九国产精品| 日韩无码黄色片| 欧美综合第一| 国产v亚洲v日韩v欧美v片另类| 久青草影院| 韩国嫰模上门援交视频| 成人a级高清视频在线观看| 香蕉在线一区二区三区| 久久久久久久久久久久色网| 婷婷综合激情| 91痴汉| 黄色av片三级三级三级免费看| 啊啊啊啊啊好大好舒服想要| 亚洲国产精品成人综合| 色综合加勒比四四季| 国产免费黄色一级大片| 色婷婷综合久久久久中文一区二区| 蜜臀AV一区二区三区| 一区二区三区一亚洲中文字幕、综合区灬| 粉嫩av在线| 91综合在线| 九九久精品| 九九久久一区二区伦理| 97超级色碰碰| 精品人妻美妇91job| 激情小说亚洲图片| 青青操轻轻| 亚洲激情深爱文学小说网站| 欧美一级黄片免费播放| 中文字幕熟女人妻丝袜丝| A片 AV一级在线播放观看免费| 亚洲Av噜噜一区二区三区妖精| AV一起草在线| 91日产欧美| 天天视频黄网站| 亚洲做性| 色999人与兽| 一区二区三区美女超清| 午夜精品久久久久| 五月婷婷六月激情| 亚洲影院成人| 91男人天堂网| 色五月亚洲| 婷婷久久五月综合激情| 亚洲一二三四区在线免费看视频| 激情五月婷| 亚洲无992tv| AV丝袜少妇| 夜嗨影院| 大香蕉综合网| 美女干逼2| 粉嫩在线一区二区懂色| 亚洲精品国产精品成人| 天堂涩涩| 欧美图片偷拍| 国产精品999zyz| 安微少妇操BBB| 丁香五月婷婷五月| 中文字幕一区二区三区四区在线视频| 日韩无码服务区| 伊人天堂在线| 亚洲精品乱码久久久久久蜜桃麻豆| 78操B| 97超碰天天| 精品超碰国产| 中文字幕日韩电影人妻| 日韩九九九| 熟女网站最新| 97免费在线视频在线观看| 精品无码久久久久久国产浪潮| 天天干1区2区在线| 婷婷久草| 91欧美性| 欧美亚洲美少妇一区二区| 五月激情视频| jizzjizz欧美| 亚洲国产成人7777| 深夜福利黄片| 少妇综合| 超碰78| 怡红院亚洲怡春院av| 九九九九88| 青娱乐日韩无码| 亚洲国产91精品一区二区久久| 超碰99re| 超碰人人干天天射| 五月天久久人妻| 福利天堂| 青女在线| 97干天天| 干B| 欧美天天谢综合网| 人妻碰碰碰碰碰碰| 亚洲情色电影网| 午夜精品视频777| japan日本高清乱xxxx| 欧美性爱第一页久久| 一区二区影视| 麻豆美女丝袜人妻中文| 老熟女网站| 哈哈操电影| 人妻少妇精品无码专区二区密桃| 日日AAvv| 精品人妻一区二区三区四区| 亚州综| 风韵犹存大大大大香蕉 | 99热线麻豆| 精品欧美日韩在线观看| 国内毛片四区| 精品久久久久久久| 一区二区三区视频| 国产成人亚洲精品无| 啊啊啊在线观看| 99色网| 精品91日日夜夜超清资源| 女优大全 - 91n| 国产精品久久久久久久久久久久久久| 五十路三区在线| 亚洲天堂加勒比| 欧美日韩在线小说 | 国产精选视频| 97国产超碰| 亚洲欧美日韩免费观看| 性久久久| 国内精品伊人久久久久影院会| 欧美成va视频网站| 蜜臀AV成人精品蜜臀AV久久| 日本999精品| 综合激情一一91| 男人的天堂VA| 亚洲 无码 偷拍| 性爱综合一区二区| 国产AV高清AV无码| 亚洲欧美一区二区三区在钱蜜桃| 久久、1234| 欧美中字不卡| 久久久久久97| 人妻系列无码专区中文有码 | 校园春色 亚洲| 亚洲综合九九| 中文字幕亚洲永久精品| 国产精选三级在线观看| 99re6久热只有精品6在线直播| 99久久无色码| 亚洲色图8| 大肥女高潮bbwbbwhd视频| 操逼大黄片| 亚洲天堂99| 色婷婷aV一区二区三区麻豆综合| 制服中出中文人人精品| 天天色欧美| 免费看国产曰批40分钟怎么下载| 一级免费啪啪片| 日韩AV一区二区三区三州三州| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 日韩99999| 日韩无码操逼片| 97碰在线视频| 亚洲成人妻日韩在线| 特污精品女优骚货黄色视频在线免费观看| 无码久久国产| 丁香六月激情| 欧美手机在线综合| 国产精品人人爽人人做可爱福利| 天天干天天拍| 精品9999| 青娱乐亚洲自拍| 奸色色 男人天堂 天天射| 91黄射| 精品国产一区二区三区四区在线看 | 超碰 97国产熟女| 无码操逼天堂| 国产成人拍国产亚洲精品| 狠狠色丁香| 久久久熟女一区| 91深夜夜| 伊人久久大香线综合无码| 亚州综合在线| 国内外色色色色色成人视频| 国产女人与拘做受视频免费| 亚洲图片欧美制度| 一起草三级AV电影在线观看 | 日韩一级欧美一级在线观看| 亚洲第91页 | 欧美久热| 草B在线| 熟女人妻一区二区三区| 久久99草| 99re国产精品视频| 欧美大干日韩| 久久久久成人亚洲国产| 久久精品高清无码一区| 亚洲暴力强奸AV| 欧美夜夜骑视频| 久久欲| 日韩精品9999| 久久国产乱子伦精品免费女人| 欧美亚洲国产自久久| 97碰| 加勒比AV网| 熟女五十路一区二区三| 男人的天堂久久狠| 强奸a片网| 国产久久天堂资源| 天天看天天综合成人网| 夜夜草天天| 狠狠图片青青草 | 精品成人女人久久| 欧美黄片欧美黄片xxx| 九九免费影片| 色播五月丁香| 秋霞一级鲁丝片A片| 91美女在线视频| 国产成年女人免费视频播放a| 蜜臀久久久国产| 亚洲一级特黄大片在线播放91| 色五月激情AV在线| 2010男人的天堂| 电家庭影院午夜69久久夜色精品国产69乱| 久久久久久久久久久97| 国产AV激情无码久久无码 | 国产一区二区三区中文字幕| 中文字幕人妻资源在线| 青青伊人这里只有精品| 人妻丝袜无 码视频专区| 九九九九热| A啊啊在线观看| 九九综合久久| 国产毛片毛片4p懂色| 天操老女人| 婷婷五月av| 囯戸精品高潮呻吟旡码| 日日骚av| 夜夜嗨绯色| 清柠毛片| 波多野结衣先锋影音| 91美女在线| 青青草视频久久久久| 亚欧Av| 91久久青青草原精品| 色男人色天堂东京热| 99久热| 99e久久国产精品| 精品无码久久| 亚洲熟妇综合久久久久久| 亚洲色偷偷色噜噜狠狠99网| 太久视频| 人人操人人插 - 百度 - 百度| 俺也射| 亚洲免费97免费| 99无码| 日韩人成网站在线播放| 99精品国产户外露出| 国产久9| 欧美在线视频播放| 夜夜嗨AV蜜臀av| 99热这里只有精品99| 色色香蕉| 中文字幕一区二区免费在线| 亚洲欧美不卡线| 性欧美| 免费超碰97久久| 亚州精品丝袜-不卡成人免费| 激情综合五| 午夜国产成人福利视频| 亚洲一欧洲中文字幕在线 | 久久国色天香香蕉| 久久五月份| 99久久9| 日本在线视频导航| 丁香六月东京热| 神马久久久久久伦理片| 高潮的A片激情扒开一区| 免费成人自拍视频在线| 国产综合久久久麻桃个| 成人青青草原伊人| 欧美激情 亚洲色图| 国产不卡的视频 | AV无码久久久精品| 深夜国产一区二区三区在线看| 免费的黄片有限公司| 熟女激情综合网| 人人爱人人乐人人操| 五月亭亭六月丁香| 成人无码在线视频网站| 无码精品久久| 欧美一区二区三区另类精品| yellow网站免费观看日韩高清无码| 精品久久久久久无码| 免费日韩黄片| 日韩精品1区2区中文字幕| 夜间福利片1000无码| 8050午夜少妇无码| 九九黄色网| 亚洲黑丝在线| 熟女一区二区| 都市激情人妻一区二区青青操视频| 欧美大片天天看| 黄色十八禁| 日比av无码| 欧美亚洲| 日本天天操| 国产精品久久久久久久久AV大片 | 96一区二区三区| 精品一区二区三区18| 99999精品| 国产精品露脸在线观看| 殴美大黄片| 久久99操天天日| 伊人大香蕉在线| 亚洲性猛交| 综合熟妇一区二区三区| 亚洲天天综合| 日韩乱中文 | 国产成人五月天丁香花| 操屄日韩| 九九综合久久| 丝袜狠狠草尤物人妻av91| 大香蕉欧美国产日韩高潮| 后入精品| 国产精品午夜福利亚洲综合网| 国产操操日韩三级黄| 久久五月天婷婷| 五月婷婷hd| 33044男人的天堂深夜备| aV中亚| 成人乱码一区二区三少妇| 色爽爽文学| 99热国产| 啪啪啪东京| 国产精品麻豆成人AV艾秋| 天天澡天天爽日日av| 亚洲欧美伦综合| 欧美,日韩综合久久| 午夜精品久久久久久久男人的天堂| 超碰人妻久久人妻中文97| 蜜区区视频79| 久久久久久日韩| 亚洲情色91| 少妇熟女视频一区二区三区| 午夜视频久久久久一区| 天天干天天爽| 九九超碰综合网| 波多野42部无码喷潮在线观看 | 亚洲丨在线| 激情国产乱伦Av| 久9久| 另类欧美色| 在线观看黄色电话| 久噜噜| 亚洲熟女乱色一区二区三区| 中亚av| 久久老熟女| 日欧操屄视频| 亚洲男人天堂视频| 十八禁的黄污污免费网站| 大香蕉色网| 狠狠操狠狠操操| 五月色综合| 亚州欧美在线| 久久亚洲婷婷| 蜜臀va69| 久久ww| 久久大香蕉97| 五月色网| 超碰人妻97| 91久久久久免| 草草草草视频| 亚洲天堂人妻一区二区| 日韩精品人妻| 91人妻人人妻| 三男一女不戴套的A片| www鬼畜国产男人的天堂| 酒色综合网| 天美国产精品| 成人午夜高潮av猛片| 99啪啪视频| 亚洲国产成人精品999| 日韩传媒在线| ji熟女.com| 少妇第一页| 天天精品| 国产精品乱码久久久| 日韩三级视频一区二区三区| 人妻铁牛TV| 综合激情97| 亚州一区二区成人片免费| 欧美综合在线91| 99久久精品无码一区二区| 91国产丝袜美女| 久热伊人| 一区二区三区美女超清| 人妻人妻天天碰| 久久精品国产亚洲AV成人直播| 91色欧美| 青青草伊人久久| 国产久久av| sewuyueav| 欧美一二三区四五区| 午夜乱轮操逼视频免费看| 亚洲一级性爱视频免费看| 亚洲天天精品| 日韩av女优在线免费一区| 男人天堂黄片| 亚洲黄色电影| 欧美操逼视频二区| 亚洲综合色婷婷| 亲子敌伦对白在线播放| 欧美激情久久久久| 麻豆人妻精品一区二区| 久久久精品中文字幕爱豆| 亚洲图片偷拍欧美| 熟妇熟女一区二三区| 国产精品爽爽va在线观看98| 国产精品福利视频| 久久高清无码夜夜操| 91色情黑丝搞鸡在线观看一区二区三区三州 | 日韩欧美午夜一区二区| 97色操| 东京成人一区| 激情看片网站| 久热影视| 99re免费| 尤物视频新赏网鲜网色诱网| 嗯嗯啊啊操死我| 亚洲精品三| 91久久免费视频互動交流| 欧美性爱一区二区三区| 综合91网| 国产美女91视频| 五月天偷拍| 一区二区视频在线播放| 久操操AV电影| 天天综合中文字幕 91| 久久久九精品| 伊人玖玖网| ′ !γ}丶。。久久精品欧美一区二区三区 | 国产 无码 一区二区| 亚洲日韩国产精品| 天天操妹子| 天堂精品| 国产精品3| www.高清无码诱惑一区.com| 国产超碰国产97| 91九色在线| 黄色毛片A片| 精品欧美А∨无码黑人大荫蒂| 久久久四区| 青青草原香蕉日本Ap| 欧美亚洲综合999| 最新岛国大片| 日韩一级性爱无码| 九九亚洲| 欧美高清色| 黄色工厂这里只有精品| 成人AV在线网站| 久久人妻一区二区三区高清| 校园春色亚洲无码| 大香蕉综合在线| 老女人老91妇女老热女| 熟女高潮合集-永久久久-成人AV| 亚洲激情 欧美色图| 在线人妻熟女一区二区三区四区五区| 艹我哪美一区无码| 啊啊啊好爽快点啊啊啊嗯嗯| 91欧美| 伊人婷婷五月天| 99亚洲天堂| 激情综合五月天| 99国产人成精品| 亚洲色图91欧美日韩| 中文字幕 人妻不满 在线视频| 大香蕉AV在线| 91丝袜美女国产| 91久青| 日本精品人妻少妇一区二区| 97AV爱| 操学生天天| 亚洲和欧美裸体美女双飞视频| 超碰98综合网| 天堂av最新电影网| 人人妻人人爽一区二区三区| 殴美性天天| 又粗又长又大国产不卡| 免费无码婬片AAAA片直播色戒| 亚洲欧洲av影音| 伊人一区二区在线播放| 久久国内| 中文字幕五区| 蜜桃不卡一区二区| 久久久久久免费电影| 欧美性爱一区二区三区| 思思久热在线精品66| 久久久久久久久久久免费精品| 影音先锋日本一区二区| 国语av最新自产拍在线观看| 大香蕉av在线| 亚洲影院小综合| 91伊人久久在线| 欧美AB在线| 国内精品a| 黄色高清无码无码破解免费暗网| 激情第四色| 亚洲自拍一区夜夜操| 亚欧美综合| a片自拍直播视频| 日韩一级成人毛片免费观看 | 国产97在线播放| 九九碰九九爱97超碰| 93人人操人人| 97二区四区| 人妻 欧美亚洲| 2017av无码免费无线播| 爱av免费| 色噜噜国产在线| 免费99精品国产自在在线| 久久人妻| 操逼操操操91| 国产一区二区久久| 美女毛片999| 无遮挡一级毛片视频免费的| 国产精品不卡少妇白| 一级婬片120分钟试看| 尤物AV免费网站| 26uuu最新| 丁香九月激情| 久久啊啊啊视频| 欧美天天综合| 亚洲成人在线播放| 国产偷人妻精品一区二区在线| 91爱啪| 91社区拍啪人妻| 99re8超碰| 欧美日韩久久精品爱爱| 狠狠色噜噜狠狠狠狠狠色综合久久 | 亚洲中文字幕精品久久久久久直播| 超碰97资源大奶| 亚州性色| 亚洲AV成人在线| 97超碰免费生活| 特级特黄一级毛片免费| 97午夜剧场日韩| 超碰久热| 亚洲欧美国产精品久久久久久久| 亚洲色图欧美色图日韩色图| 天天香香欲综合| 亚洲欧美第一页| 天天爱天天操| 精品人妻一区二区三区四区| 亚洲最大网站av| 学生妹天天看| 日本狂喷奶水在线播放212| 欧美激情亚洲色图| 久久久999| 97超碰色五月| 欧美色欧美| 久久秀这里有精品| 五十路三区在线| 91色艳| 中文字幕精品探花视频| 天天肏美女| 亚洲无码国产探花在线观看| 欧美日韩资源在线| A级毛片在线看免费| 91久久午夜无码鲁丝片久久人妻| 日本操逼视频免费| 熟妇视频一区二区三区在线观看| A 天堂| AAAA欧美日韩| 69AV女优男人的天堂| а√天堂资源官网在线资源| 97激情97激情| 最新日日夜夜天天干干| 98精品国产乱码久久久久久| 操逼www.| 欧美色爱综合| 曰韩精品九九无码| 人人操人人爽人人操人人| 物尤视频一区二区| 日本人妻最新在线中| 久久久久久久少妇| 亚洲欧洲综合av在线| 97一本大道亚洲一区| 人人射人人操人人摸| 96国产精品| 久久久蜜桃一区二区三区| 搡老女人老熟女91| 热久久99999| 国产极品一区二区三区三州| 五月婷婷色| 96精品久久久久久久久久| av亚洲天堂资源网站| 国产精品制服丝袜清纯唯美| 精品在线78| 青娱乐亚洲热| 操逼国产免费| 国产精品在线免费| 好看的91视频| 操逼网站视频漫画国产| 亚洲 暴爽 AV人人爽日日碰| 大香蕉在线视频重口味毛片在线| 无码高清专| 久操免费在线| 嗯嗯啊啊啊啊轻点视频| 玖色AV| 成人一级性爱| 麻豆AV一区二区天美传媒| 欧美色图亚洲特色| 天美麻花大全视频| 久久精品国产精品一区 | 精品国产一区二区三区在线播出| 国产欧美日产一区二区三区 - 国产欧美日| 色人久久| 成全在线观看免费观看| 超碰人人妻| 激情抓乳插进去啪啪啪日韩| av影院十区| 粉嫩少妇自慰在线| 丁香五月综合| 国产一区二区三区导航| 人人搞人人插人人操| 天天干夜夜操一区二区| 日本九九久久99播| 日韩啪啪网| 吖在线不卡一区二区国产剧情| 久久精品久久久久久久| 亚洲欧洲激情| 人人妻人人色| 久久色人体| 九色视频91| 欧美黑人精品在线播放| 一区二区乱码福利| 蜜臀99久久精品久久久久久| 新视频sss国产| 日韩一区二区熟女| www.激情| 五月婷婷激情网| 逼逼逼逼操操操操操操操操操午夜剧场| 亚洲九九九| 精品一区二区三区18| 天堂网 主播 亚洲| 激情亚洲天堂| yiren97| 殴美性色a级欧美| 日本久久精品| 亚洲夜夜欢无码一区二区| 新久久AV| 亚洲无线码欧洲精品区别| 九九碰九九爱97超碰| 亚洲一区二区三区婷婷| www.人人摸在线视频| 精品视频久久区| 久久99草| 国产性爱欧美性爱在线| 国产熟妇一区二区| 欧美亚洲美少妇一区二区| 综合网~91综合网| 日本不卡三级网在线播放| 天天欧美欧美亚洲网| 激情五月综合网| 婷婷激情四射| 亚洲欧美精品91| 密桃99999| 啊啊啊啊嗯嗯嗯用力好爽| 久久国产视频性吧| 日产狠狠干| 97WW精品| 中文字幕一区二区三区人妻少妇在线 | 久久久久久久久久久久黄色 | 九九久久综合| 99久在线精品99re8热| 激情综合五| 91亚洲黑人| 国产精品对白内射| 久久久中文版| 久久久久久久六六 | 欧洲色| 亚洲欧美激情另类色图| 一区二区三区 丝袜 高跟 美腿| 综精品久久久aaaa| 97久久免费| 日本最新1区2区3区| 欧美精品欧美精品系列 | 亚洲啪啪性视频| 日本三级中国三级99人妇网站| 夂久色| 精彩国产视频播放1区2区| 久久久∴| 97亚洲综合在线| 蜜臀99久久精品久久久懂爱| 欧美中文字幕日韩在线| 91在线超高颜值国产| 日韩激情中文字幕有码| 亚洲人人操| 第45页一区二区| 蜜桃精品视频一区二区三区| 上床啊啊啊| 欧美精品久久久久久久丰满| 天天看高清麻豆| 国产精品大屁股999| 91第一页| 啪啪啪东京| 大香蕉久| 伊人精品视频| 欧美宗合网| 中文字幕在线观看永久| 91色婷婷综合久久中文字幕二区| 香一区二区三区| 久久网亚洲| 亚洲乱码精品一区二区| 久久夜黄色无码A级大片| 五月婷婷色| 日韩不卡网操逼中文字幕日韩| 日韩内| 欧美一区二区日韩三区| 97精品综合| 精品人妻一区二区三区视频| 91丰满| 激情小说成人日本无码一| 伊人影院中文字幕| 99re6在线视频精品免费完整版安卓版| 青娱乐啪啪视频| 无码av永久免费专区网站| 色婷婷aV一区二区三区麻豆综合| 日本一级不卡一二区| 大二网站亚洲| 亚洲精品男人的天堂| 亚洲综合一| 91久久免费视频互動交流| 久久久中文| 天美一区在线| 亚洲性爱乱操x| 久久久com| 天天舔日美女视频| 两性色网| 伊人网在线观看| 成·人免费午夜在线观看| 9色在线| 日韩欧美蜜桃精品久久中文字幕久久| 韩美日操逼| 亚洲综合97中文网| 欧美日韩色| 久久香蕉国产线看观看猫咪av| 久久久久9999妇女| av网站在线看| 国产精品一区人妻精品阁在线| 大香交| 日韩av一级黄片| 日日噜噜夜夜久久亚洲一区二区 | 综合网欧| 日韩欧美性吧婷婷乱伦大香蕉| 99精品久久| 欧美后入式| 亚洲福利中文字幕在线| a片亚洲一本通视频| 波多野结衣被操50分钟免费视频 | 亚洲脚交| 五月婷婷丁香中文字幕| 狠操91,com| 亚洲国产精品有声| 国产一区二区久久| 国产高清精品一区二区三区毛片| 冬京热男人的天堂| 最新日本中文字幕| 美女人妻色网站| 欧美日韩大香蕉| 欧美爆操91| 亚洲无码国产精品久久| 久久久久久久久久久久黄色 | 热热色国产一二区AV| 亚洲国产高清福利视频| 久久国产精品视频| 婷婷啪啪| 日日夜夜精品视频| 夜夜操av亚洲一区二区| 欧洲性爱无码区| 青青草视频导航官网| 国产毛片在线| 探花激情视频| 97鸡把在线视频| 天无日色综合| Sekablack无码一区| av午夜玫瑰| 欧美强奸乱能| 久久这里只精品| 熟女丰满人妻一区| 欧美熟妇成人一区二区| 天天舔天天日天天射| 免费看日产一区二区三区| 青草地一本线一区二区三区| 精品妇女一区二区三区| www.99色| 国产日韩中文字幕欧美| 九月婷婷| 国产美女在线精品免费看| 91久久久老司机| 久久99综合| 大香蕉乱级| 蜜臀aV午夜一区二区三区| 久热无码| 国产精品久久久久久久AV大片| 伊人四虎综合| 亚洲 欧美 天天| 家庭乱伦国产| 91N综合网| 亚洲 欧美 另类 综合 偷拍| 丁香五月综合| 夜夜嗨视频| 久久久久斤小| 黑丝内射一区二区三区| 高清无码一区二区三区| 色色97爱| 日韩78m视频| 亚洲成人av色网| av日韩国产一区二区| 91精品人妻| 国产精品丝袜久久亚洲不卡| 色综合天天| 国产绿奴视频在线观看| 78操B| 97视频www| 日韩免费人妻色情网站| 人人操人人搞人人草| 久久精品一区二区| 天堂精品| 欧美老妇女内射网址| 激情丁香五月| 思思热影视| 亚洲欧美色图小说| 98久久超碰| 伊人嫩草| 白丝少妇一区二区| 久久久无码国精品无码三区三区| 人人看人人爰人人操| 日韩无码极品| 欧美日韩制服| 亚洲九九视频在线观看| 亚洲色图加勒比| 男人兔费天堂| 日韩人妻一区二区精品| 午夜福利av电影在线| 91欧洲国产成人久久精品网站| 大白逼三四级| 免费看国产大AB| 91美女在线视频| 人妻一区二区三区| 艹我哪美一区无码| 爱做久久久久久| 色色香蕉| 在线岛| 久热影视| 国产肏逼网站| 免费成人自拍视频在线| 亚洲狠| 黄色工厂这里只有精品| 日韩欧美~中文字| 看看日B真人视频| 97精选久久| 激情四射五月天| 2019午夜福利视频| 天堂资源站| 97精品国产精品免费观看| 婷婷五月天无码| 四季AV一区二区凹凸精品小说| av操操不卡| 麻豆性爱视频在线播放| 午夜欧美J进J出白浆流出久久久| 久久久9品一区二区三区| 嗯嗯,啊啊,国产精品| 97操97色| 人妻天天爽夜夜爽精品2| 日韩内射视频| 欧美熟妇精品黑人巨大一二三区| 最新一二三区视频| 射丝袜高跟鞋99| 99re95| 欧美天堂超碰97| 亚洲国产精品久久久久婷婷老年| 亚洲久热| 青草草免费网站av| 丰满人妻无码一区二区三区|