亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

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

Windows托盤氣球通知無效排查:Shell_NotifyIcon字段與系統(tǒng)策略 托盤圖標(biāo)出現(xiàn)在任務(wù)欄右下角右鍵菜單響應(yīng)正常雙擊也能喚出主窗口唯獨調(diào)Shell_NotifyIcon發(fā)出去的那個氣球通知屏幕上一點動靜都沒有——而且返回值還是TRUE。這個現(xiàn)象我前后遇到過三四回每次根因都不一樣有一次是uFlags漏了NIF_INFO有一次是程序被改成后臺常駐方式導(dǎo)致圖標(biāo)壓根沒掛到 explorer 上還有一次是測試機上把通知和操作的總開關(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. 三種不彈故障點完全不同1.1 圖標(biāo)壓根沒進(jìn)托盤區(qū)這是最容易被跳過的一步。很多人在排查氣泡的時候默認(rèn)圖標(biāo)都在那兒了肯定是氣泡的問題但實際情況里圖標(biāo)顯示正常并不代表NIM_ADD成功過——有一種情況是圖標(biāo)顯示出來了但那是上一次進(jìn)程殘留的僵尸圖標(biāo)鼠標(biāo)劃過就消失點它也沒反應(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)存。正確的釋放時機是NIM_DELETE之后再DestroyIcon順序不能反。還有一種更隱蔽的程序被注冊成了服務(wù)或者用計劃任務(wù)以不管用戶是否登錄都運行的方式啟動。這種進(jì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)了溢出面板用戶不點開小箭頭是看不到的。這不是故障但排查時容易被誤判成圖標(biāo)沒加進(jìn)去先確認(rèn)一下托盤設(shè)置里的隱藏的圖標(biāo)菜單。1.2 圖標(biāo)在氣泡死活不出來這一類才是標(biāo)題里說的情況。此時NIM_ADD是成功的szTip能正常顯示右鍵菜單也能彈唯獨氣泡不出來。常見原因按出現(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因為添加階段不需要氣泡NOTIFYICONDATA 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ā)氣泡是另一段獨立邏輯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的位置寫錯編譯一點問題沒有運行起來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)鍵提醒置了這個位就等于主動放棄了顯示機會。反過來如果你不置這個位系統(tǒng)在某些版本上仍然會按全局策略抑制橫幅——這一點各版本行為不完全一致所以不要用它來做能不能顯示的開關(guān)。NIIF_NOSOUND相對簡單加上就不響提示音。有個細(xì)節(jié)是它不影響氣泡本身的顯示只影響聲音所以別把它和靜音模式下氣泡不顯示混為一談。3. 代碼沒問題但屏幕沒反應(yīng)系統(tǒng)層攔在哪3.1 通知總開關(guān)、專注助手與安靜時間這是排查時最容易漏掉的一層因為它不在你的代碼里而在用戶的機器上。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)通知中心里也找不到。這種情況你改一萬行代碼都沒用。排查手段是讓測試機恢復(fù)到默認(rèn)狀態(tài)通知總開關(guān)打開、專注助手關(guān)閉、當(dāng)前應(yīng)用在通知列表里處于允許狀態(tài)。還有一點如果程序以管理員權(quá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)閉通知氣球提示項域環(huán)境下的機器可能被統(tǒng)一下發(fā)。3.2 會話與用戶身份Session 0 和 RunAs 的死角前面提過會話 0 的問題這里展開說。Windows 的服務(wù)宿主機制決定了服務(wù)進(jìn)程運行在會話 0那是一個沒有交互式桌面的獨立會話。任何在會話 0 里調(diào)用的 UI 相關(guān) API包括Shell_NotifyIcon、MessageBox、CreateWindow要么失敗要么創(chuàng)建一個用戶永遠(yuǎn)看不到的窗口。這個問題在實際項目里通常表現(xiàn)為開發(fā)機上好好的裝到客戶機上就沒通知。區(qū)別在于開發(fā)機是雙擊 exe 運行的客戶機上是通過服務(wù)或者計劃任務(wù)啟動的。定位方法是在任務(wù)管理器里加一列會話 ID看進(jìn)程對應(yīng)的數(shù)字是不是和當(dāng)前登錄用戶一致。如果不一致那問題不在代碼在于部署方式——要么改成用戶登錄后自啟動要么用會話隔離機制把 UI 部分拆成一個運行在用戶會話里的獨立進(jìn)程。還有一種情況是以另一個用戶身份運行比如右鍵以其他用戶身份運行或者用憑據(jù)管理器啟動。這時圖標(biāo)會加到那個用戶的托盤里當(dāng)前登錄用戶看不到但那個用戶如果同時在線快速用戶切換在他自己的桌面里是能看到圖標(biāo)的。現(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 勝在可控能拿到點擊、能進(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)策略、會話、桌面可見性。這兩條分支的排查方向完全相反所以返回值必須看。第二路看窗口消息。如果要做氣泡點擊響應(yīng)uCallbackMessage指定的消息會在氣泡被點擊時發(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斷點檢查發(fā)送時的uFlags值圖標(biāo)不在氣泡無會話 0、圖標(biāo)句柄被提前釋放任務(wù)管理器看會話 ID檢查DestroyIcon時機氣泡出但標(biāo)題空白字符集不匹配看sizeof(NOTIFYICONDATA)與工程字符集設(shè)置時好時壞消息循環(huán)被阻塞、定時器被搶占檢查主線程是否有長耗時同步操作特定機器必現(xiàn)通知開關(guān)、專注助手、組策略重置通知設(shè)置為默認(rèn)后復(fù)測4.3 把什么時候不彈記錄成日志這一點聽起來平淡但它決定了后續(xù)排查是幾天還是幾小時。我在托盤模塊里加了一組固定的日志點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有些機器上不生效因為這時窗口句柄剛創(chuàng)建托盤圖標(biāo)還沒真正掛上去。穩(wěn)妥做法是Load之后用BeginInvoke推遲到消息隊列下一輪再調(diào)或者在Shown事件里調(diào)。timeout參數(shù)在 Vista 之后基本被忽略了實際時長由系統(tǒng)的輔助功能設(shè)置決定。這一點和老系統(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)起來?,F(xiàn)象很有迷惑性日志顯示已發(fā)送氣泡但用戶是在幾秒甚至幾十秒之后才看到或者干脆看不到因為已經(jīng)過了時效。這類問題在后臺任務(wù)完成時彈通知的場景里特別常見因為后臺任務(wù)完成的時刻主線程往往正在刷新界面。處理辦法是有的把耗時任務(wù)放到后臺線程主線程只負(fù)責(zé) UI或者在不依賴NotifyIcon對象的場景下用一個獨立的隱藏窗口在自己的線程里跑消息循環(huán)來處理托盤消息。后者工程量大些但如果托盤邏輯要脫離主窗口獨立存活比如主窗口可以關(guān)閉但程序不退出這個結(jié)構(gòu)反而更清晰。WPF 這邊沒有內(nèi)置的托盤圖標(biāo)控件社區(qū)里常見的做法是引用 WinForms 的NotifyIcon或者用第三方庫。第三方庫如果自己實現(xiàn)了Shell_NotifyIcon的互操作那前面說的cbSize、uFlags、字符集三件事依然適用換語言不換原理。選庫的時候可以看一眼它有沒有處理NOTIFYICON_VERSION_4沒處理的話右鍵菜單的坐標(biāo)計算在某些機器上會偏。6. 把這套東西做成不容易再出問題的結(jié)構(gòu)6.1 用一個帶狀態(tài)位的發(fā)送函數(shù)收口在項目里我最后的做法是把托盤的添加刪除發(fā)氣泡三個動作集中在一個小模塊里模塊內(nèi)部維護一個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)劃過才消失。這不僅僅是觀感問題——殘留的圖標(biāo)會占用那個uID下次啟動如果復(fù)用同一個 ID行為可能不可預(yù)期。另一個清理時機是WM_ENDSESSION系統(tǒng)關(guān)機或者注銷時程序不一定能走完正常的退出流程。在這個消息里補一次NIM_DELETE能減少殘留。還有崩潰場景進(jìn)程直接掛掉不會執(zhí)行任何清理代碼圖標(biāo)一定殘留這個沒辦法只能靠系統(tǒng)自己回收。如果程序支持多實例uID的分配要小心。兩個實例用同一個hWnd和uID是不可能的hWnd天然不同但如果用了自己生成的guidItem標(biāo)識兩個實例可能會互相覆蓋。多實例場景建議用單實例機制直接禁掉或者在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后面換人維護或者系統(tǒng)升級改一個文件就夠了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日本肉体xxxx裸交| 婷婷性网| 成人开心网在线视频| 一区二区影视| 色就色综合| 亚洲精品天堂久久A∨51成人漫| 免费操逼视频下载| 中文字幕日韩综合| 久久大精品乱码视频人妻熟女| 久久精品国产久精国产| 精品人妻一区二区三区在线视频不卡| 自怕偷自怕亚洲精品| 人妻 中文 日韩| 99热精品在线观看| 天天天乱色综合全| 97 国产精品| 秋霞一集毛片观看| 国产综合网站在线播放 | 五月激情视频| 国产AV天美| 欧美成人贴图| 欧美日韩操逼动图| 亚洲 日韩 欧美 国产综合体| 啊啊啊啊啊啊好湿好爽视频| 狠狠入| 丁香婷婷五月| 高潮的A片激情扒开一区| 丰满人妻一区二区三区四区| 一起草欧美| 婷婷五月天激情小说| 青青草国产亚洲精品久久| 亚洲蜜臀精品视频久久| 99这里只有精品国产| 麻豆这里只有精品| 五月丁香影院| 久操视频在线| 中文字幕一区二区免费在线| 久久性爱视频| 97欧美色综合| AAAAAAAAA黄片| 欧美三级一级| 午夜精品久久久99热蜜桃的功能特点| 中国人高清www色视频免费| 伊人久久综合精品欧美| 伊人青青一区成人视频在线观看区| 夜夜爽夜夜摸夜夜操免费视频| 美女好片色日本| 超碰在线观看av不卡| 亚洲中文人妻色| 老鸭窝在线视频播放| 亚洲毛片一级带毛片基地| 欧美色三级片91| 蜜区区视频79| 久久女婷| 人妻色情天天操| 很黄很色的视频在线观看| 91 国产丝袜在线放观看| 熟妇色99| 91大神精品长腿在线观看网站| 婷婷伊人綜合中文字幕| 中文字幕性感少妇av| 五月丁香在线| 国产SV一线| 欧美 日韩第一性色| 亚洲av青草久久一区二区| 91人妻素女| 成人情色一区二区| 欧美黑人168页欧美黑人167| 日本东京热久久久电影| 91久久久久久| 亚洲欧美激情小说| 日韩精品免费高清视频在线| 9超碰免费| 啊啊啊网站| 日本三级韩三级99久久| 熟妇女伦乱视频视频| 亚洲国产精品V?在线播放| 婷婷色中文字幕| 久久夜精品一区二区三区| 97超碰人人操人人操| 性爱久久| 91精品国产综合久久久蜜臀酒店| 一起草av| 干少妇视频| 狠狠五月天| 极品人妻少妇综合| 色99视频| 国产日韩久久| 午夜福利久久久噜久噜久久综合| 国产精品人妻免费精品| 激情第四色| 99热在线播放| 99re这里只有精品3| 亚洲国产美女久久久久| 日韩电影天堂视频二区三区| 欧美日韩一区二区三区四区蜜桃| 欧美 日韩第一性色| 五月天精品| 9精品久久久久| 日韩欧美中文日韩欧美色| 人妻人妻天天碰| 欧美综合区| 大香蕉狠狠爱| 91操人视频| 精品一区二区三区国产| 欧美啪啪天堂| a人片中文字幕一区二区| 欧美顶级黄色大片免费| 超碰色图| 九九九九九九九九九九精品视频| 天堂种子在线www网资源| 超碰97COm中文| 日韩资源网| 97射欧美| 99.色网| 99re免费视频精品全部| 久久国99999| 国产精品午夜高潮呻吟久久av| 啊啊啊啊无码| 久久久久网站-538在线视频-欧美永久乱码 | 亚洲精品中文字幕一区在线视频| 国产成人五月天丁香花| 怡红院成人av| 婷婷丁香五月综合| 樱花蜜乳av| 蜜臀久久99精品久久久久电影| 五月天黄色av| 九九热九九| 98人妻精品一区二区色欲| 夜夜嗨一区| 后X久久| 欧美日韩在线国产在线| 亚洲熟女综合一区二区| 国产精品色哟哟| 偷窥自拍亚洲天堂网爆| 婷婷人妻激情| 97av,com| 中文日本免费高清| 亚洲精品一区二区日本| 亚洲久9| 亚州男人的天堂| 色优久久| 操逼日韩无码 | 日本天天吊| 国模不卡| 密乳无码| 国产对白刺激视频| 国产精品直播在线观看直播| 懂色av一区二区三区天美传媒| 欧美性视频二区三区| 亚洲视频小说| 欧美成人色| 乱伦一区二区三区‘| 日韩在线国产字幕| 麻豆91熟妇人妻中文字幕茄子| 国产后入清纯| 综合久久99亚洲人妻中文在线| 青青草吊丝| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 大香蕉十区| 亚洲天堂综合AV| 91碰碰| 嗯啊不要在线| 亚洲欧洲日韩国产自在线| 九九干| 欧美性爱三区二区| 人人透人人操| 大香蕉久| 国产 码在线成人网站| 国产亚州高清国产拍精| 欧美综合骚| 五月丁香婷婷综合| 中文字幕91页| 天天肏夜夜肏| 丰满搜索结果 -第18页- 久久高清无码| 超碰98综合网| 91在线视频国产网站| 亚洲乱码国产乱码精网站| 中文啪啪视频| 综合天天。| 国产强奸无码乱伦| 欧美激情另类一区二区| 一区二区视频在线播放| 福利风月五月天影院| 乱伦AVxx| 色欧美天天| 久久久涩| 本道在线| 91人妻精华帖| 欧美黑人猛交春色影视大全| 久久中文字幕女同性恋一区| 香伊人在线| 亚洲人妻一区二区三区| 吊色| 黄色人人| 成人女人国产| 色综91| 欧美人妻另类在线| 激情五月天网站| 中文字幕日韩综合| 国产又大又粗又长视频在线| 乱伦日本色图AⅤ| 91人人臊| 超碰久久网| 69XX一中文字幕人妻91| www色色com| 久久久麻豆精品| 亚洲影院小综合| 九九九免费视频| 九九色色| 中文字幕88av在线| 蜜臀在线视频| 丁香五月影院| 亚洲色综合| 国产无码成人无码| 久久超碰97| 亚洲国产日韩欧美熟妇在线| AV男人天堂网| 亚洲第一黄色av网站| 国产美女口爆吞精| 亚州一区二区| 午夜男人天堂| 新亚洲无码| 99热97| 天天澡天天爽日日AV| 伊人亚洲国产一成人久久精品,久久| 久久久性爱| 少妇高潮对白在线观看| 午夜丁香| 国产乱子伦久久精品综合一区二区三| 美中韩AV综合网| 东京热av影院| 97色欧州| 亚卅熟女乱色| 久久伊人最新网址视频| 久久中日麻豆| 综合色啪| 98人妻精品一区二区色欲| 亚洲男人的天堂在线看| 9999免费精彩视频| 91美女视频| 久久亚码| 98一区二区精品| 可以在线观看的黄色网址| www.男人的天堂| 男女一进一出视频久久| 大香蕉综合久久| 日本不卡三级网在线播放| 蜜臀人妻少妇久久在线观看| 天天干夜夜| 日产国产精品中文久久婷婷| 日韩黄色av中文字幕| 日本一卡二区在线| 欧美中字二区| 亚州综合AⅤ| 超碰午夜| av一区二区三区不卡| 91精品大奶人妻| 国产精品夜夜夜| 自拍第一页| 超碰在线人妻不卡| 天天视频综合在线观看视频| 91色噜噜狠狠| a片 xxxx受爽视频| 亚洲男人天堂Av| 欧美激情亚洲情色| 天天综合网合集91| 综合欧美日本三级| 久久激情四射婷婷丁香五月天| 豆花视频操逼网址| 国产真乱mangent| 九热中文字幕| 日韩无码第3页| 97操97色| 9Ⅰ超碰| 欧美性爱一区二区三区| 国产无码精品高清| 好属操| 亚洲97在线| 色香阁在线| 日韩无码操逼片| 欧美性爱一区二区三区| 少妇超碰在线| 日韩激情毛片一级久久久| 男人的天堂VA| 久日综合网| 精品人人| 日日干日日| 日韩欧美一级特黄大片| 白丝被操91| 麻豆成人影音在线| 人人妻人人澡人人爽久久av| 久久夜精品一区二区三区| 肉丝网站91| 三级三久久线久久99久目本WW| 自怕偷自怕亚洲精品| 日韩免费a级毛片无码a∨| 96超碰网| 青青久草| 怡春院久久| 99这里只有精品| 黄色高清无码无码破解免费暗网| 日韩亚洲中文字幕在线| 亚洲无码太久| 国产成人无码啪| 精品国模无码| 天天躁日日躁AAAAXXXX国产| 日韩福利综合一区| 中国操逼无码| 久久久性| 精品人妻一区二区三区四区石在线| 亚洲色图欧美色18直播在线| 亚洲视频精选| 亚洲乱熟女一区二区| 我想要啊 啊 啊| 亚洲图片欧美另类综合免费视频大大香| 色超碰综合| 欧美日韩另类字幕中文| 欲女人妻性色av| 91网站18+| 国产精品电| 国产天天噜一噜久久久| 国产成人亚洲精品无| 亚洲第一视频 欧美风情 日韩| 91熟女网| 被窝影院午夜看片无码| 久久久久国产一区二| 天天影视综合网欧美精品| 亚殴在线| 超碰 欧美| 日韩黄片视频试看| 亚州精人品大香蕉| 99这里都是精品| 肏逼视频日本| 国产亚洲色婷婷久久99精品91| 一区二区精品更新提醒| 精品国产乱子伦一区二区三区,精品一| 欧美色图 色综合图| 久久精视频美日韩在线视频| 91色碰| 精品在线78| 久久一级无码精品毛片6| 亚洲不卡不卡中文字幕不卡| 欧美日韩狠狠爱| 福利在线黄片| 偷拍综合亚洲| 国产精品高潮呻吟av久久4虎| 日韩成年人性爱视频| 三级日韩一区二区三区| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 97热视频在线观看| 日韩精品区二区三区不卡| 亚洲熟女乱色一区二区三区久久久| 午夜性生活av免费在线看 | 91久久九九精品国产综合| 嫩草伊人久久精品| 国产精品69久久久久孕妇欧美| 一区二区三区亚洲| 日韩一级免费性爱| 亚洲AV无码天美传媒一区| 久久精彩视频9| 日韩美女高潮喷水视频| 另类专区加勒比| 日本在线999| 校园春色欧美色图| 丰满人妻一区二区三区免费,| 91精品微拍福利| 欧美一区二区一级岛国大片| 综合亚洲欧美精品日韩?v| 亚洲精品啪视频| 2010男人的天堂| 国产精品乱码久久久久久久久久久久| 国产精品69久久久久久久| 欧美日韩插逼视频| 啊啊啊com| 天堂av最新电影网| 亚洲有码视频二区| 久久激情五月| 天天在线91| 亚洲国产中文字幕| 青娱乐二区免费| 日韩精品一二三四| 91丰满| 一起草日韩| 丁香五月天堂网| 精品一区二区三区四区外站| 免费观看性欧美一级| 欧美强奸乱能| 亚州久久9| 99少妇内射| 国模无码一区二区三区在线| 欧洲精品一区二区三区| 黄片免费日韩| 色噜噜狠狠色综无码久久合欧美| 少妇色综合| 亚洲一区二区三区中文字幕| 久久精品中文| 亚洲五码一区二区三区| 色五月激情AV在线| 综合 欧美 亚洲 日本| 午夜美女诱惑电源网| 欧美九9 9 9| 欧美热图99| 澳门成人网站久国产日韩| 欧洲久久一二线| 夜夜福利| 蜜桃久久久久久| 亚洲中字慕不卡| 精品国产乱码久久久久A| 国产二区三区免费视频| 亚洲激情 欧美色图| 天天日B夜夜干B时时操B| 后入式999| 亚洲天堂人妻熟妇视频| 国产熟女一区二区| 久久久久久91香蕉国产| 欧美亚洲色图另类国产| 超碰97COm中文| 99国产精品久久久久久久成人热| 福利色色| 91视频伊人| 91日日夜夜| 夜夜爽爽爽| 成人一级性爱| 熟女熟妇伦久久影院毛片一区二区 | 97色诱| 91人妻中文| 欧美天天综合网| 大奶尤物鲍汁淫荡欧美视频粉嫩夜夜骚| 极品尤物自安慰| 人妻色情天天操| A啊啊在线观看| 大香蕉操久久| 天天做天天爱| 性开放中文AV高清无码免费看| 欧美高清91| 亚洲成人色情五月天丁香花| 天天添天天干电影| 亚洲天堂人妻熟妇视频| 欧美一二三区四五区| 777超碰| 国产精品人妻免费精品| 2017天天透天天通天天擦| 亚洲强奸乱伦影视网| 啪啪视频免费在线观看| 天天综合网合集91| 女人天堂AV五区在线| 秋霞无码av鲁丝片一区| 大屁股人妻女教师撅着屁股| 天堂精品一区| 精品女同一区| 女人的天堂大香蕉网| 99无码| 影音先锋视频在线| 大香蕉一级黄色片久久| 97在线免费看视频| 夜夜躁狠狠躁日日躁av| 99热这里只有精品18| 97欧美日韩综合| 97超级久久| 亚洲视频二区 | 日本五十路在线| 成人日本精品九区| 蜜臀99999| 欧美老妇综合网| 国产日韩精品一区二区三区| 天天干2区3区| 日韩精品99久久久久久中文字幕| 欧美日韩国产电影| 亚洲男人天堂2013| 中韩中文字幕在线观看| 欧美综合网A| 精品久久久av无码免费| 日韩激情无码影院| 日韩一级成人毛片免费观看| 亚洲激情在线| 秋霞一级视频在线观看免费| 人人艹亚洲| 92午夜免费福利视频| 长长久久曰曰夜夜成人网| 一区 欧美 日韩 麻豆| 久久久久亚洲一区女同性恋中文字幕| 欧美后入视频| 中文字幕伊人| 最新9久久久9免费视频| 天天躁狠狠躁av| 超碰色97| 色情乱伦AV| av最新免费中文字幕| 亚洲色图片区| 高清国产无码av| 国产欧美亚洲精品a第2页| 北京专精特新企业招聘信息| 亚洲一区二区性爱电影| 黄色大香焦1级‘′‘| 亚洲欧洲另类| 亚洲综合图片在线| 欧美成97爱| 91丨九色丨国产丨人妻在线| 亚洲一区中文字幕一区| 久久亚洲影院一区二区| 久久久久深夜无码| 99久久无码| 999国产精品999| 91色图片| 91丝袜| 中日韩久久久| 精品九九九九九九九| 色妺妺AⅤ| 日韩亚洲精品一区二区| 欧美v日韩欧亚洲电影天堂色诱,国产传媒 | 亚洲 图片 综合91| 少妇色综合| 超碰欧美97| 欧美三级中文字幕hd| 欧美超碰9798| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 日日黄色三级网站| 欧美狠狠干| 午夜天堂啪啪| 成人热久久精品| 亚洲视频中文一区| 日韩人体偷拍| 后入式五六区| 亚洲第一无码播放立川理惠| 久久久久国产| 18禁网站在线播放| 91无码人妻| 亚洲av青草久久一区二区| 激情五月婷| 后入人妻无码| 无码国产精品久久久久| 亚洲老司机123专区| 午夜亚洲国产理论秋霞| 国产女人9999| 91社区拍啪人妻| 日本精品性生活久久久| 国产精品 久久久精品一牛| 国内操逼视频二区| 国产成年免费大片黄在线观看| 欧美国产有色电影| 在线人人人人人人精品超| 国产午夜福利视频在线| 人人干黄色| 亚洲drav色图| 中文字幕一区 二区三四五 区日 日骚 | 超碰 另类 欧美 | 中文久久| 人妻爽爽啪视频| 成年人性爱日韩| 亚洲一二三四区| 久久久久久久国产| 人妻 丝袜美腿 中文字幕| 欧美激情亚洲| 丰满少妇一区二区三区四区观看| 丰满人妻一区二区三区四区| 四虎影视精品| 日日夜夜青青草母狗| 国产超碰人人操| 嗯阿好爽好紧| 亚洲囯产精品女人久久久| 日本久久久久久久久久| 天天操天天日青青草超碰av| 丝袜美腿91| 性色高清在线| 国产精选三级在线观看| 久久东京热久久| 天天综合香 ld视频| 色欲天天综合网| 国产精品久久99日日| 懂色Av| 国桃视频产巨乳精品一区二区在线| 丰满少妇一区二区三区免费看| 天天日天天射天天干| 91 亚洲 欧美 日韩 国产 综合| 凹凸视频在线一区二区| 久草综合视频| 最近2019中文字幕国语免费版| 人人摸人人入| 久久大| 欧美劲爆第一页| 日韩成人人妻网站| 男女激情中文字幕| 成人AV素股で擦久久| 大学生美女口爆| 97在线欧洲| 99999re| 日本护士高潮| 色综合久久av| 亚洲视频,小说| 91丝袜人妻| 欧美日韩97在线| 激情婷婷五月天| 很黄很色的视频在线观看| 成人性交免费视屏| 国产AB视频| 久久大线蕉一区| 超碰久久性爱| 1024香蕉视频| 欧美99| 精品久久人妻成人网| 国内亚洲高清无码| 嗯嗯啊好爽| 做爱福利视频一区二区| 天色综合网| 蜜色网色哟哟| 夜夜嗨AV蜜臀av| 麻豆天美久久91| 麻豆天美国美国产| 农村妇女一级二级三级视频| 99热免费| 亚洲日韩AV视色| 日韩亚洲美州欧洲综三区一品在线| 精品久久人妻成人网| 久久久国产亚洲精品系列| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 久久五十路熟女人妻| 女人天堂av在线播放| 密臀视频三区免费网站| 蜜臀视频网站| 麻豆久久精品亚洲精品88| aa片毛片| 国产精品白丝在线播放| 日韩欧美成人午夜福利| 影音先锋乱| 欧美日韩99| 亚洲,欧美,春色,另类| 91原创在线观看| 国产一区麻豆免费观看| 成人精品水蜜桃久久久久久久| 免费男人的天堂| 国产精品一区二区三| 蜜乳成人AV| 人人射人人操人人摸| 中文字幕 av v| 国产精品久久久久久久久久久久久久久| 欧洲精品久久| 视频不卡中文字幕| 午夜男人av| 丁香六月啪| 少妇毛片久久| 国产精品动态一区二区三区四四| 亚洲丝袜综合| 久久直播国产| 日日干日日操五月天伦理视频| 99久久久无码| 91亚洲丝袜熟女| 97超碰人人模人人拍人人| 国产亚洲精品玖玖玖在线观看| 超碰日本97美女人妻人人玩人人爱| 丁香婷婷激情五月天无毒不卡 | 天堂涩涩| 欧美少妇人妻| 999岛国大片| 日韩少妇丰满亚洲| 天天肏视频| 乱伦日本色图AⅤ| 久久免费精品96| 亚洲在饯| 五月丁香大香蕉| 九九九九九九九九九九精品视频| 精品人妻av区天天看片| 一区二区三区视频在线观看免费| 中文字幕一区二区三区蜜臀| 精品国产乱码久久久久久久| 天天看天天在线精品| 亚洲欧洲精品成人| 97色网| 这里有精品| 99精品无码| 国产 日韩,欧美 自拍| 欧美成人都市人妻| 夜夜爽夜夜| 青青草九九九九九| 思思久热在线精品66| 资源在线观一 二| 人人妻人人爽人人精品| 色香色欲天天综合网天天来吧| 日韩中文字幕宗合在线| 日韩性爱长视频免费| 婷婷色中文字幕| 视频不卡中文字幕| 精品久久99| 黄色免费网| 精品96久久| 温婉少妇玩3p| 超碰97极品9| www.夜夜操| 欧美性爱超碰97| 国产高清1234区| 国产精品久久久| 狠狠搞 亚洲91| 欧美一级国产一级| 欧美性少妇| 国产精品青青草| 无码免费在线观看黄色片| 69久久久久久久久久久久久| 日韩精品中文字幕一| 精品对白久久不卡| 婷色五月| 青青欧美| 国产精品呦一区二区三区| 美女91av| 禁片 高清 在线观看视频网站| 国产极品粉嫩馒头一线天av| 自偷自拍的亚洲视频| 超碰久超碰久| 亚洲免费97免费| 九九Av| 人妻一区二区三区视频 | 情趣丝袜无码操逼视频| 色偷偷男人的天堂麻豆| 天天日天天舔| 国产最新小视频在线播放下载 | 国产成人精品午夜福利| 色色综合网站| 啪啪视频亚洲第一| 久久超碰com| 日韩9999| 国产 码在线成人网站| 国产91亚洲精品一区二区三区| 欧美一品道| 国产av白丝| 亚洲av淫乱| 日韩精品人妻一区二区| 99re在线视频国产| 九九热精品免费视频| 一区三区啪啪| 1人人看人人摸人人操| 视频不卡中文字幕| 欧美同性恋 的搜索结果 - 91n| 久久大香蕉手机高清视频| 无码国产精品午夜不卡(| 国产成人欧美一区二区三区的国产| 国产一级高清免费观看| 一区二区视频在看| 国产激情在线| 精品无av| 亚洲成人帖图| 密臀AV在线| 亚洲精品蜜桃久久久一区二区三区| av爱爱爱| 在线欧美亚洲| 欧美综合天天| 色欧美亚洲| 欧美色九九| 精品视频久久| 激情小说激情视频| 亚洲图片小说欧洲| 超碰97综合网| 天天综合网~91| 一本一道久久综合久久| 久久精品人妻一区二区| 久久这里| 久污| 国产精品一区二区后入| 天堂亚洲精品久久老牛| 久久精品国产精品| 欧洲大香蕉| 国产一区二区久久| 综合视频91| 日韩精品大香蕉伊人在线| 伦在线97| 九9精品| 天天综合站| 一本大道久| 96一区二区| 欧美亚洲激情| 天天欧美| 亚洲精品久久久久毛片A片拉屎 | 亚洲美女色图| 精品人妻一区春色| 日本道久久综合色色| 中日韩久久久| 韩美日操逼| 日本操逼视频不卡直接放| 激情看片网站| 超碰99在线| 东京日日夜夜| 九九拍拍精品视频在线播放| 色偷综合| 国产女人视频三四五区| 国产精品午夜福利亚洲综合网| 99re公开精品免费视频| 99热在线播放| 麻豆人妻少妇在线免费观看| 久久久久人| 日日夜夜摸| 夜间福利片1000无码| 九九人人操| 天堂伊人久久| 欧美成人性活片| 男人a天堂手机在线版| 国产黄a三级三级三级av在线看 | 亚洲免费97免费| 亚洲色图A| 伦伦成年午夜免费视频| 91N欧美| 天天躁狠狠躁av| 51一区二区三区| 精品一区二区国产日韩| 久久五月综合| 久久久久久久久久久久九| 丰满人妻一区二区三区四区| 91碰超| 亚洲无套久久嗯嗯| 99精品无码| 把腿张开老子CAO烂你| 日韩pv中文| 综合自拍| 日韩乱伦AⅤ| 婷婷丁香五月天综合东京热| 国产视频一区二区三区久久亚洲天堂| 欧美肥臀在线| 午夜福利成人免费视频| 青草园大香蕉| 日韩性爱毛片操骚逼| 亚洲最大的黄色电影网站。| 亚洲在线91| 国产成人网站在线观看| 任我爽在线视频免费观看| 天美传媒婬乱在| 开心激情婷婷| 超碰欧美在线欧美| 国产人妖视频一区在线观看| 少妇色综合| 一本一道vs波多野结衣| 四季av一区二区凹凸精品小说| 99视频精品| 9精品久久| 亚洲天堂人妻熟妇视频| 941超碰| 中文字幕精品资源在线| 999色欧美中文字幕| 色综合天天| 老女人综合| 十八禁视频网站| 欧美久久人体| 成人三级片无码| 欧美色图电影| 欧美性特| 两女互慰AV高潮喷水在线观看| 九九九久久久久| 人人干人人操人人..com| 日韩有码中文字幕女同性恋| 91久久精品国产| 日韩图区 偷拍| 久操免费电影| 毛片17S| 久久99午夜精品一区人妻| 欧美激情精品| 性性久久| 超碰在线国产| 欧美片第一页| 久超碰这里只有精品| 99爱久久视频频| 午夜男女爽爽爽在线视频| 亚洲婷婷丁香在线| 久久久久久裸体| 亚洲少妇诱惑| 婷婷色在线| aaaa少妇高潮大片| yaouchengrenav| 国产精品久久久亚洲第一牛牛_在线观看| 91网亚洲| 欧美日韩99精品麻豆传媒| 青娱乐国产剧情av一区| 蜜桃香蕉久草精品在线| 97天天弄| 久久久久久中文字幕中文字幕最新| 亚洲欧洲精品视频发布| 亚洲精品一区二区日本| 欧美黑人91| 亚洲欧美setu| 超碰97资源中文字幕| 思思99热| 伊人久久婷婷| 欧美视频边做饭边橾| 人人 操人人 操人人| 国产精品点击进入在线影院高清| 久久大香蕉97| nuu12国产麻豆精品| 精品96久久| 日日橹狠狠爱欧美超碰| 日韩99999色| 99.色网| 人人搞人人插人人操| 美女啊啊啊啊啊啊啊| 亚洲国产91精品一区二区久久| 2017天天操天天日| 国产风韵犹存熟妇三区| 四虎精品一区| 亚洲色香| 综合天天网| 有码免费观看| 美国美女AV在线| 欧美精品丝袜久久久中文字幕| AV在线性爱| 女性91网站| 女人18精品一区二区三区| 免费一级欧美片片线观看| 亚欧免费观看视频| 综合色区偷拍| 中出91| 欧美熟妇视频| 亚洲成人久久一区二区| yaouchengrenav| 白丝AV| 久久夜夜| 高精欧美色| 东京热毛片调教| 亚洲男人天堂网站| 97色在线视频| 欧美天天弄| 天天综合欧美| 久久精品超碰| 青青五月天| 中文字幕人妻丝袜乱一区三区| 久久国产精品视频| 美女性91| 日B操| 国产强奸乱伦xd| 国产熟女乱论| 亚洲精品视频在线| 六月丁香婷| 欧亚综合一卡二卡中文字幕| 东京太热久久久| 99999无码| 日韩大香蕉AV影片| 亚洲脚交| 91丝袜在线观看| 免费?级毛片无码?∨蜜芽试看| 国产操逼逼网| 天天爱天天操| 蜜臀久久久国产| 亚洲天堂一区二区| 免费精品无码一级毛片牛牛影视| 色综合国产在线观看| 性爱视频无打码在线观看| 欧美特大黄一级片片免费| 26uuu国产成人综合| 天天日天天插| 99热aaa| 欧美激情一区二区| 夜夜爽夜夜摸夜夜操免费视频| 成年在线视频日本亚洲在线视频区精品江靖宇公司| 伊色久人大在线| 囯戸精品高潮呻吟旡码| 蜜桃视频精品一区二区| 欧亚在线视频| 99精品在线| 97超碰免费人人性爱| 欧美综合色| 中文字幕天堂在线| 色欲日韩欧美在线一区| 97激情97激情| 2020中文字幕在线观看| 亚洲制服aⅴ中文字幕| 天天做天天爱| 色五月AV在线| 韩国一级婬片A片无码天美| 韩日无码在线观看| 精品视频日日夜夜| 久九九九九九九九热| 国产成人精品必看 | 少妇淫妇久久久久久久| AV在线性爱| 日韩AV电影网站| 欧洲亚洲人人爽爽视频| 一级性爱视频免费观看| 久久9视频| 色香欲天天天天综合色| 八戒无码国产午夜福利| 暖暖精品二区三区观看| 精品欧美乱码久| www久久久| 欧美78P| 熟妇熟女视频一区二区三区| 粉嫩av一区二区三区天美传媒 | 日本三级韩国三级美三级91| 国产a片操逼| 麻豆国产第一| 天堂无码精品国产久| 97操在线| 国产福利av精彩对白| 色97国产69香蕉| 91精品无码人妻系列| 国产精品国产| 制服乱伦| 日韩精品啪啪啪| 性爱乱伦一区| 日1区2区3区2020| 五月天婷婷影院| 校园春色五月天| 二对二中文字幕。| 国产精品久久久无码aV去| 久久久111| 日韩无码专区| 亚洲性爱成人| 蜜臀av网址| 免费看毛片操穴| 亚洲电影中字一区二区| 尤物视频偷拍免费| 久久国产精品一级二级三级| www.亚洲成人一区| 秘书高跟黑色丝袜国产91在线| 蜜桃视频精品一区二区三区| 色五月综合| 美女尤物人人操| 久久AV无码AV| 91综合网在线| 亚欧操逼片在线观看| 91在线限制级| 91爱综合| www.色操逼| 一二三四视频中文字幕在线看| 97伊人| 男人的亚洲天堂| www.欧精品| 久操不卡视频| 嗯啊视频免费在线观看| 久久久久久无码人妻中文字幕| 五月丁香婷婷啪啪| 国产精品视频麻豆入口| av黄图片在线观看| 欧美日本视频一区| 欧美狠狠操| 五月婷婷丁香| 自拍偷拍国产欧美日韩韩| 欧美啪啪啪91| 蜜臀av网址| 91天射| 久偷拍| 高凊专区人人操| 丁香五月成人| 国产97视频免费观看| 久热影视| 亚洲春色欧美激情自拍| 久久久久99精品成人片蜜臀| 很狠操| 精品9999| 97精选久久| 伊人久久亚洲中文字幕不卡| 亚州色站 日韩电影| 中文啪啪视频| 亚洲高潮少妇| 天天添天天干电影| 激情专区综合| AV无码久久久精品| 黄片国产精品一区二区| 一本色道综合久久欧美| 欧美黄业| 91精品91久久久久77777| 亚洲一区二区麻豆影院| 国产欧美日韩精品中文| 日韩有码 一区二区三区| 黄页| 欧美综合色| 国产91 丝袜在线播放 | 91肏屄网| 99热这里只有精品9| 99热色精品| 欧美熟爽综合| 国产熟女一区二区丰满| 黄总AV色图| 国产视频大全| 日韩午夜国产| 欧美日韩亚洲高清不卡一区二区三区| 青娱乐大香蕉| 玖玖超碰熟| 欧美综合色,www| 亚洲一区二区三区在线激情| 欧美一级久久久丰满| 免费毛片在线播放| 国产精品乱人伊人网| 欧洲与亚洲欧美精品中文字幕| 久久久久斤小| 俺去啦自拍| 色欧美综合| 人人操肉肉| 丁香五月天堂网| 日韩激情视频| 一区二区三区成人| 色阁阁AV综合网| 新视频sss国产| 99re黄 | 9色国产精品一区粉嫩| 久久性爱精品一区| 日韩性爱网址| 91欧美成人色站| 青青草男人天堂| 啊啊啊水好多| 亚洲 欧美 制服 另类 自拍| 成人网址在线观看| 九九九九九九成人| 青青伊人加勒比海| 亚洲性感丝袜诱惑在线观看| 99少妇内射| 老熟妇乱轮| 99色视频| 手机av亚洲丝袜美腿日韩第一页二页| 丝袜亚洲综合| 亚洲成?V人片在线观看福利| 国产精品午夜成人福利| 日日不卡av| 国产精品视频白浆免费| 亚洲最大黄网| 蜜臀99久久国产| 首页中文字幕中文字幕免费| 精彩视频日韩| 97视频在线播放| 人妻av在线| 久久久专区| 精品亚洲成人免费在线| 天天色悠悠激情| 久久久久成人网| 亚洲一区日韩| 综合久久99亚洲人妻中文在线| 91天天综合| 亚洲男人天堂2019| 97欧美资源| 男人的天堂亚洲| 欧美一级黄色免费专区| 日韩欧美女优电影| 91骚熟女| 久久精9| 唐山老熟妇露脸啪啪叫| 91美女视频直播| 97久久精品亚洲| 91AV入口| 精品人妻伦一区二区三区久久| 亚洲精品aa久久伊人 | 野狼福利社区| 一区,二区,三区网站| 天堂无码精品国产久| 日本幼女18+| 天天综合网91入口| 人人操人人大香蕉| 狠狠操狠狠操操| 97jingpin| 国产精品91一样| 日本精品网站在线中文| KK色在线影院| 丰满的三级少妇欧美久久久| 亚洲丨在线| 欧美日日夜夜| 99在线无码精品秘 入口黑人| 超碰超碰超碰超碰的大鸡吧操黑丝袜 | 国产精品一区二区 尿失禁| 国产精品久久久久久夜夜夜夜| 色五月综合| 欧美色www亚洲国产阿娇要播| 91少妇香蕉久久精品| 一区二区三区在线资源| 国产精品女久久久久av爽| 老女人老91妇女老热女| 性一交一乱一交A片久久四色| 国产精品香蕉| 丝袜亚洲91| 欧日韩不卡视.频|