国产成人欧美一区二区三区vr_久久国产精品人人爽人人爽_国产精品永久免费播放_肉欲啪啪a∨无码精品一区二区_国产超短裙jk丝袜在线_亚洲AV片高清资源在线观看_国模无码一区二区三区久久_国产成年人未进视频_中文字幕无码精品夜_一区二区三区在线视频免费看_亚洲成AV人片在线观看网址_日本激情视频高清综合久久_亚洲午夜视频福利_国内大量揄拍人妻精品視_久久国产精品福利二区三区

ARTICLE DETAIL

資訊詳情

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

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

Windows托盤氣球通知無(wú)效排查:Shell_NotifyIcon字段與系統(tǒng)策略 托盤圖標(biāo)出現(xiàn)在任務(wù)欄右下角右鍵菜單響應(yīng)正常雙擊也能喚出主窗口唯獨(dú)調(diào)Shell_NotifyIcon發(fā)出去的那個(gè)氣球通知屏幕上一點(diǎn)動(dòng)靜都沒(méi)有——而且返回值還是TRUE。這個(gè)現(xiàn)象我前后遇到過(guò)三四回每次根因都不一樣有一次是uFlags漏了NIF_INFO有一次是程序被改成后臺(tái)常駐方式導(dǎo)致圖標(biāo)壓根沒(méi)掛到 explorer 上還有一次是測(cè)試機(jī)上把通知和操作的總開(kāi)關(guān)關(guān)掉了。所以看到氣球通知無(wú)效這種描述先別急著翻代碼得先把無(wú)效這兩個(gè)字拆開(kāi)判斷它到底屬于哪一類。這篇是寫(xiě)給正在做 Windows 桌面端常駐托盤程序的人看的以 CWin32為主順帶把 C#WinForms和 WPF 封裝層上的等價(jià)坑一起擺出來(lái)。讀完至少能做到兩件事一是清楚Shell_NotifyIcon發(fā)氣泡時(shí)到底是哪幾個(gè)字段在起作用二是手上有一套能自己往下查的鏈路而不是對(duì)著屏幕干瞪眼改參數(shù)。氣球通知這東西看著只有幾行 API實(shí)際上牽扯到結(jié)構(gòu)體版本、字符集、窗口消息循環(huán)、系統(tǒng)通知策略、會(huì)話隔離五個(gè)層面任何一層出問(wèn)題表現(xiàn)都是沒(méi)反應(yīng)所以分層定位比試錯(cuò)重要得多。1. 三種不彈故障點(diǎn)完全不同1.1 圖標(biāo)壓根沒(méi)進(jìn)托盤區(qū)這是最容易被跳過(guò)的一步。很多人在排查氣泡的時(shí)候默認(rèn)圖標(biāo)都在那兒了肯定是氣泡的問(wèn)題但實(shí)際情況里圖標(biāo)顯示正常并不代表NIM_ADD成功過(guò)——有一種情況是圖標(biāo)顯示出來(lái)了但那是上一次進(jìn)程殘留的僵尸圖標(biāo)鼠標(biāo)劃過(guò)就消失點(diǎn)它也沒(méi)反應(yīng)。真正判斷圖標(biāo)是否屬于當(dāng)前進(jìn)程最簡(jiǎn)單的辦法是把鼠標(biāo)懸停在圖標(biāo)上看szTip里設(shè)置的提示文字有沒(méi)有出現(xiàn)如果提示文字是空白的或者顯示的是別的程序的文字那基本可以確定當(dāng)前進(jìn)程根本沒(méi)加上圖標(biāo)氣泡自然無(wú)從談起。NIM_ADD失敗的原因里hIcon為空是最常見(jiàn)的一個(gè)。Win32 里常見(jiàn)寫(xiě)法是先LoadIcon或者LoadImage拿一個(gè)HICON再填進(jìn)nid.hIcon。這里有個(gè)真實(shí)存在的坑如果這個(gè)HICON是通過(guò)CreateIconIndirect、CopyIcon這類函數(shù)動(dòng)態(tài)生成的而代碼里又在NIM_ADD之后順手調(diào)了DestroyIcon托盤圖標(biāo)會(huì)立刻變成一塊空白或者花屏。原因是 shell 并沒(méi)有把圖標(biāo)數(shù)據(jù)拷貝走它只是持有了這個(gè)句柄你銷毀了它那邊就指向了一塊已經(jīng)失效的內(nèi)存。正確的釋放時(shí)機(jī)是NIM_DELETE之后再DestroyIcon順序不能反。還有一種更隱蔽的程序被注冊(cè)成了服務(wù)或者用計(jì)劃任務(wù)以不管用戶是否登錄都運(yùn)行的方式啟動(dòng)。這種進(jìn)程運(yùn)行在會(huì)話 0Session 0而會(huì)話 0 是沒(méi)有交互式桌面的Shell_NotifyIcon可能返回成功圖標(biāo)卻永遠(yuǎn)不可能出現(xiàn)在用戶眼前。判斷方法很簡(jiǎn)單任務(wù)管理器里看這個(gè)進(jìn)程屬于哪個(gè)會(huì)話如果不是當(dāng)前登錄用戶的會(huì)話號(hào)那所有 UI 相關(guān)的 API 都是白搭。另外提一句Windows 11 的托盤區(qū)把默認(rèn)圖標(biāo)折疊進(jìn)了溢出面板用戶不點(diǎn)開(kāi)小箭頭是看不到的。這不是故障但排查時(shí)容易被誤判成圖標(biāo)沒(méi)加進(jìn)去先確認(rèn)一下托盤設(shè)置里的隱藏的圖標(biāo)菜單。1.2 圖標(biāo)在氣泡死活不出來(lái)這一類才是標(biāo)題里說(shuō)的情況。此時(shí)NIM_ADD是成功的szTip能正常顯示右鍵菜單也能彈唯獨(dú)氣泡不出來(lái)。常見(jiàn)原因按出現(xiàn)頻率排下來(lái)大概是uFlags沒(méi)帶NIF_INFO、NIM_MODIFY之前圖標(biāo)狀態(tài)已經(jīng)丟了、szInfo為空字符串、系統(tǒng)通知開(kāi)關(guān)被關(guān)閉、發(fā)送氣泡時(shí)消息循環(huán)處于阻塞狀態(tài)。uFlags這個(gè)問(wèn)題我在代碼評(píng)審里見(jiàn)過(guò)不止一次。有人寫(xiě)了一個(gè)UpdateTrayIcon()函數(shù)把NIF_ICON | NIF_MESSAGE | NIF_TIP全填上然后在這個(gè)函數(shù)末尾順手填了szInfo和szInfoTitle以為這樣氣泡就會(huì)跟著圖標(biāo)一起更新。實(shí)際上Shell_NotifyIcon是嚴(yán)格按uFlags位掩碼來(lái)決定讀哪些字段的沒(méi)置NIF_INFO位szInfo那一段內(nèi)存它連看都不看。同理dwInfoFlags的圖標(biāo)類型、NIIF_NOSOUND這類標(biāo)志也都只在NIF_INFO置位時(shí)才生效。還有一種是先刪后沒(méi)加。某些程序在響應(yīng)WM_ENDSESSION或者顯示器的WM_DISPLAYCHANGE時(shí)會(huì)先NIM_DELETE再重新NIM_ADD如果中間某次NIM_ADD因?yàn)榇翱诰浔鸁o(wú)效而失敗后續(xù)的NIM_MODIFY就會(huì)一直返回失敗氣泡當(dāng)然也發(fā)不出來(lái)。所以我習(xí)慣把是否已添加做成一個(gè)顯式的狀態(tài)位任何一次NIM_ADD失敗都要記錄下來(lái)后續(xù)發(fā)氣泡前先檢查這個(gè)狀態(tài)。1.3 氣泡彈了但標(biāo)題是空的或者全是亂碼嚴(yán)格來(lái)說(shuō)這不算無(wú)效但它經(jīng)常和無(wú)效混為一談因?yàn)橛脩艨吹揭黄綁K或者空白會(huì)直接反饋通知沒(méi)顯示。亂碼的根因幾乎只有一個(gè)結(jié)構(gòu)體用了 ANSI 版本而字符串傳的是寬字符或者反過(guò)來(lái)。NOTIFYICONDATA在 SDK 頭文件里是通過(guò)UNICODE宏展開(kāi)成NOTIFYICONDATAW或NOTIFYICONDATAA的如果工程屬性里的字符集是使用多字節(jié)字符集而你代碼里寫(xiě)的是L...編譯器要么報(bào)錯(cuò)要么悄悄截?cái)嘧罱KszInfo里只有一個(gè)字符加個(gè)結(jié)尾。這個(gè)坑在遷移老項(xiàng)目時(shí)特別容易踩到。老工程當(dāng)年是 MBCS后來(lái)為了支持多語(yǔ)言整體改成 Unicode結(jié)果某個(gè)自己封裝的托盤類里還留著char緩沖區(qū)和新結(jié)構(gòu)體拼接編譯能過(guò)跑起來(lái)就是亂碼。定位辦法是直接看sizeof(NOTIFYICONDATA)的值Unicode 版本在 x64 下大概是 976 字節(jié)這個(gè)量級(jí)如果在調(diào)試器里看到cbSize明顯偏小那基本就是字符集或者結(jié)構(gòu)體定義對(duì)不上。2. NOTIFYICONDATA 里決定氣泡生死的字段2.1 uFlags、szInfo、szInfoTitle 三者的聯(lián)動(dòng)關(guān)系先把一段能用的代碼擺出來(lái)后面所有的討論都圍繞它展開(kāi)。下面這段是添加圖標(biāo)的初始化注意uFlags里沒(méi)有NIF_INFO因?yàn)樘砑与A段不需要?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; }這里有兩個(gè)細(xì)節(jié)值得說(shuō)。第一NIM_MODIFY階段uFlags只寫(xiě)NIF_INFO是完全正確的語(yǔ)義是這次我只改氣泡部分其它字段別動(dòng)不需要把NIF_ICON再寫(xiě)一遍。第二szInfo傳空字符串注意不是空指針是長(zhǎng)度為 0 的字符串的語(yǔ)義是移除當(dāng)前顯示的氣泡不是什么都不做。有些代碼在錯(cuò)誤分支里填了個(gè)空字符串當(dāng)兜底結(jié)果就是看起來(lái)什么都沒(méi)發(fā)生。字段長(zhǎng)度也有硬上限szInfo是 256 個(gè)WCHARszInfoTitle是 64 個(gè)WCHAR都包含結(jié)尾的空字符。超長(zhǎng)會(huì)被截?cái)嘤肧tringCchCopy這類安全函數(shù)能保證不出界但內(nèi)容確實(shí)會(huì)丟。我見(jiàn)過(guò)標(biāo)題寫(xiě)了一長(zhǎng)串路徑導(dǎo)致后面全被切掉的看起來(lái)像標(biāo)題顯示不全其實(shí)是長(zhǎng)度超限。2.2 cbSize、uVersion 與那個(gè)共用體的歷史包袱cbSize是所有NOTIFYICONDATA故障里最隱蔽的一個(gè)。這個(gè)字段的用途是讓 shell 知道調(diào)用方用的是哪個(gè)版本的結(jié)構(gòu)體因?yàn)閺?Windows 2000 到現(xiàn)在這個(gè)結(jié)構(gòu)體加過(guò)好幾輪字段。寫(xiě)sizeof(NOTIFYICONDATA)在正常情況下永遠(yuǎn)是對(duì)的問(wèn)題出在兩種場(chǎng)景一是工程引用了很老的第三方 SDK 頭文件結(jié)構(gòu)體定義本身就缺字段sizeof算出來(lái)偏小二是用 C# 或其它語(yǔ)言手工定義StructLayout時(shí)字段漏了或者順序錯(cuò)了。第二種場(chǎng)景我踩過(guò)。C# 里為了不依賴 WinForms 的NotifyIcon有人會(huì)自己DllImport一個(gè)Shell_NotifyIcon然后手寫(xiě)一個(gè)NOTIFYICONDATA結(jié)構(gòu)體。少寫(xiě)一個(gè)guidItem或者把uTimeout的位置寫(xiě)錯(cuò)編譯一點(diǎn)問(wèn)題沒(méi)有運(yùn)行起來(lái)cbSize對(duì)不上NIM_ADD直接返回FALSE。這種情況在調(diào)試器里看一眼cbSize和預(yù)期值差多少基本就能定位。再說(shuō)uVersion。NOTIFYICONDATA里uTimeout和uVersion是共用同一塊內(nèi)存的union { UINT uTimeout; UINT uVersion; };也就是說(shuō)你不能在同一次調(diào)用里既設(shè)超時(shí)又設(shè)版本號(hào)。設(shè)置版本要用NIM_SETVERSION把uVersion填成NOTIFYICON_VERSION_4這個(gè)動(dòng)作會(huì)改變后續(xù)回調(diào)消息的編碼方式——lParam的低字是消息 ID高字是圖標(biāo) ID。很多人加了NIM_SETVERSION之后發(fā)現(xiàn)右鍵菜單不彈了就是因?yàn)榛卣{(diào)處理還在按老格式解析lParam。所以這條命令不是加了更好而是加了就得改回調(diào)。NOTIFYICON_VERSION_4還有另一個(gè)副作用uTimeout被徹底忽略氣泡停留時(shí)長(zhǎng)完全由系統(tǒng)的輔助功能設(shè)置決定。如果你有代碼依賴精確控制氣泡顯示 3 秒還是 10 秒那在 v4 下是做不到的。2.3 dwInfoFlags 里幾個(gè)會(huì)反向生效的標(biāo)志dwInfoFlags決定氣泡左側(cè)那個(gè)小圖標(biāo)的樣式常見(jiàn)取值是NIIF_NONE、NIIF_INFO、NIIF_WARNING、NIIF_ERROR、NIIF_USER。前四個(gè)都是系統(tǒng)內(nèi)置圖標(biāo)直接寫(xiě)就行NIIF_USER則需要額外配合hBalloonIcon字段。這里有個(gè)真實(shí)的坑NIIF_USER置位但hBalloonIcon留空時(shí)不同 Windows 版本的處理不一致有的版本回退到hIcon有的版本干脆畫(huà)一個(gè)默認(rèn)圖標(biāo)還有的版本會(huì)導(dǎo)致整個(gè)氣泡不顯示。我現(xiàn)在的做法是要么不用NIIF_USER用就老老實(shí)實(shí)把hBalloonIcon填上別指望系統(tǒng)幫你兜底。另一個(gè)有意思的標(biāo)志是NIIF_RESPECT_QUIET_TIMEWindows 7 引入的。置位之后如果系統(tǒng)處于安靜時(shí)間現(xiàn)在叫專注助手這條氣泡會(huì)被直接丟棄不是延遲顯示是丟棄。這個(gè)標(biāo)志的設(shè)計(jì)初衷是尊重用戶不想被打擾的意愿但如果你的程序發(fā)的是關(guān)鍵提醒置了這個(gè)位就等于主動(dòng)放棄了顯示機(jī)會(huì)。反過(guò)來(lái)如果你不置這個(gè)位系統(tǒng)在某些版本上仍然會(huì)按全局策略抑制橫幅——這一點(diǎn)各版本行為不完全一致所以不要用它來(lái)做能不能顯示的開(kāi)關(guān)。NIIF_NOSOUND相對(duì)簡(jiǎn)單加上就不響提示音。有個(gè)細(xì)節(jié)是它不影響氣泡本身的顯示只影響聲音所以別把它和靜音模式下氣泡不顯示混為一談。3. 代碼沒(méi)問(wèn)題但屏幕沒(méi)反應(yīng)系統(tǒng)層攔在哪3.1 通知總開(kāi)關(guān)、專注助手與安靜時(shí)間這是排查時(shí)最容易漏掉的一層因?yàn)樗辉谀愕拇a里而在用戶的機(jī)器上。Windows 10 之后系統(tǒng)設(shè)置里有一個(gè)通知和操作的總開(kāi)關(guān)關(guān)掉之后所有應(yīng)用的通知全部靜默下面還有按應(yīng)用細(xì)分的開(kāi)關(guān)以及專注助手的幾種模式關(guān)閉、僅優(yōu)先通知、僅鬧鐘。Shell_NotifyIcon發(fā)出的氣泡在 Windows 8 之后已經(jīng)被系統(tǒng)當(dāng)作通知來(lái)管理了所以它會(huì)完整地受這些開(kāi)關(guān)影響。表現(xiàn)是Shell_NotifyIcon返回TRUE氣泡不出現(xiàn)通知中心里也找不到。這種情況你改一萬(wàn)行代碼都沒(méi)用。排查手段是讓測(cè)試機(jī)恢復(fù)到默認(rèn)狀態(tài)通知總開(kāi)關(guān)打開(kāi)、專注助手關(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)后不彈。這個(gè)差異在不同系統(tǒng)版本上表現(xiàn)不一致我的做法是測(cè)試矩陣?yán)锕潭ò胀?quán)限和管理員權(quán)限兩行別只測(cè)一種。老系統(tǒng)上還有一個(gè)注冊(cè)表開(kāi)關(guān)HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced下的EnableBalloonTips值為 0 時(shí)禁用氣球提示。這個(gè)鍵在新系統(tǒng)上是否仍然生效取決于版本但在 Windows 7 時(shí)代它是標(biāo)準(zhǔn)的關(guān)閉方式排查老環(huán)境時(shí)值得看一眼。組策略里也有對(duì)應(yīng)的關(guān)閉通知?dú)馇蛱崾卷?xiàng)域環(huán)境下的機(jī)器可能被統(tǒng)一下發(fā)。3.2 會(huì)話與用戶身份Session 0 和 RunAs 的死角前面提過(guò)會(huì)話 0 的問(wèn)題這里展開(kāi)說(shuō)。Windows 的服務(wù)宿主機(jī)制決定了服務(wù)進(jìn)程運(yùn)行在會(huì)話 0那是一個(gè)沒(méi)有交互式桌面的獨(dú)立會(huì)話。任何在會(huì)話 0 里調(diào)用的 UI 相關(guān) API包括Shell_NotifyIcon、MessageBox、CreateWindow要么失敗要么創(chuàng)建一個(gè)用戶永遠(yuǎn)看不到的窗口。這個(gè)問(wèn)題在實(shí)際項(xiàng)目里通常表現(xiàn)為開(kāi)發(fā)機(jī)上好好的裝到客戶機(jī)上就沒(méi)通知。區(qū)別在于開(kāi)發(fā)機(jī)是雙擊 exe 運(yùn)行的客戶機(jī)上是通過(guò)服務(wù)或者計(jì)劃任務(wù)啟動(dòng)的。定位方法是在任務(wù)管理器里加一列會(huì)話 ID看進(jìn)程對(duì)應(yīng)的數(shù)字是不是和當(dāng)前登錄用戶一致。如果不一致那問(wèn)題不在代碼在于部署方式——要么改成用戶登錄后自啟動(dòng)要么用會(huì)話隔離機(jī)制把 UI 部分拆成一個(gè)運(yùn)行在用戶會(huì)話里的獨(dú)立進(jìn)程。還有一種情況是以另一個(gè)用戶身份運(yùn)行比如右鍵以其他用戶身份運(yùn)行或者用憑據(jù)管理器啟動(dòng)。這時(shí)圖標(biāo)會(huì)加到那個(gè)用戶的托盤里當(dāng)前登錄用戶看不到但那個(gè)用戶如果同時(shí)在線快速用戶切換在他自己的桌面里是能看到圖標(biāo)的?,F(xiàn)象就是我這邊沒(méi)圖標(biāo)但換個(gè)賬號(hào)登錄就有了很容易被誤判成偶發(fā) bug。3.3 Windows 8 之后氣球改頭換面成 Toast這條屬于知道就行不知道會(huì)繞遠(yuǎn)路的范疇。從 Windows 8 開(kāi)始Shell_NotifyIcon發(fā)出的氣球通知在視覺(jué)上已經(jīng)變成了 toast 樣式——從屏幕右下角滑入、停留幾秒、然后收進(jìn)通知中心。接口沒(méi)變樣式變了。這個(gè)變化帶來(lái)兩個(gè)實(shí)際影響。第一通知中心會(huì)成為這些氣泡的歸檔地用戶在通知中心里能看到歷史消息這意味著重復(fù)發(fā)同一條消息的行為和老系統(tǒng)不一樣了老系統(tǒng)上重復(fù)發(fā)會(huì)不斷彈新的新系統(tǒng)上可能出現(xiàn)合并或者覆蓋。第二某些系統(tǒng)版本上如果程序沒(méi)有設(shè)置AppUserModelID通知在系統(tǒng)里的歸屬會(huì)是一個(gè)默認(rèn)的宿主表現(xiàn)是通知列表里看不到你的應(yīng)用名用戶在設(shè)置里想允許你的通知都找不到對(duì)應(yīng)條目。設(shè)置AppUserModelID的 API 是SetCurrentProcessExplicitAppUserModelID在進(jìn)程啟動(dòng)早期調(diào)用。如果對(duì)通知的可靠性要求比較高其實(shí)可以考慮直接走 Toast 通知那套接口代價(jià)是需要注冊(cè)快捷方式、需要處理激活回調(diào)工程復(fù)雜度上一個(gè)臺(tái)階。托盤氣球勝在簡(jiǎn)單二十行代碼就能跑Toast 勝在可控能拿到點(diǎn)擊、能進(jìn)通知中心歸檔、能被用戶精細(xì)管理。選哪個(gè)取決于你的通知是順手提示一下還是業(yè)務(wù)流程的一環(huán)。4. 一條能自己走完的排查鏈路4.1 用三十行最小工程把業(yè)務(wù)代碼摘出去我處理這類問(wèn)題的固定第一步是新建一個(gè)空的 Win32 工程只保留一個(gè)隱藏主窗口、一個(gè)托盤圖標(biāo)、一個(gè)定時(shí)器定時(shí)器每三秒發(fā)一次氣泡。這個(gè)工程大概三十行寫(xiě)完不超過(guò)十分鐘。之所以要先做這一步是因?yàn)樵谡鎸?shí)項(xiàng)目里氣泡不顯示可能是業(yè)務(wù)邏輯、線程調(diào)度、窗口生命周期三者疊加出來(lái)的你直接在里面改參數(shù)改一次跑一次變量太多判斷不了哪個(gè)改動(dòng)起了作用。最小工程的骨架大致是這樣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測(cè)試標(biāo)題, L這是一條測(cè)試氣泡, NIIF_INFO); } return 0; case WM_DESTROY: RemoveTrayIcon(hWnd); PostQuitMessage(0); return 0; } return DefWindowProc(hWnd, msg, wParam, lParam); }如果這個(gè)最小工程能彈氣泡說(shuō)明 API 用法和系統(tǒng)環(huán)境都沒(méi)問(wèn)題問(wèn)題在你的業(yè)務(wù)代碼里如果彈不出來(lái)說(shuō)明問(wèn)題在環(huán)境或者調(diào)用方式上接下來(lái)往系統(tǒng)層查。這一步能省掉一半的排查時(shí)間。4.2 返回值、窗口消息、監(jiān)視工具三處取證最小工程也不彈的時(shí)候取證要分三路走。第一路看返回值。Shell_NotifyIcon返回FALSE說(shuō)明 shell 明確拒絕了這時(shí)基本可以鎖定字段錯(cuò)誤cbSize不對(duì)、hWnd無(wú)效、uID沖突。返回TRUE但無(wú)顯示說(shuō)明接收端沒(méi)問(wèn)題問(wèn)題在展示端系統(tǒng)策略、會(huì)話、桌面可見(jiàn)性。這兩條分支的排查方向完全相反所以返回值必須看。第二路看窗口消息。如果要做氣泡點(diǎn)擊響應(yīng)uCallbackMessage指定的消息會(huì)在氣泡被點(diǎn)擊時(shí)發(fā)到你的窗口。用一個(gè)能抓窗口消息的工具掛在目標(biāo)窗口上觀察發(fā)氣泡前后有沒(méi)有WM_USER范圍內(nèi)的消息流動(dòng)。這一步主要是確認(rèn) shell 到底有沒(méi)有收到請(qǐng)求。第三路看系統(tǒng)狀態(tài)。通知設(shè)置、專注助手、會(huì)話 ID、是否提權(quán)這四項(xiàng)各花一分鐘確認(rèn)比讀一天文檔有用。我現(xiàn)在的習(xí)慣是在程序的關(guān)于頁(yè)面里放一個(gè)隱藏的診斷入口一鍵打印這幾項(xiàng)狀態(tài)客戶反饋問(wèn)題時(shí)讓他截個(gè)圖能省掉好幾輪來(lái)回?,F(xiàn)象優(yōu)先懷疑驗(yàn)證方式NIM_ADD返回 FALSEcbSize、hIcon為空、窗口句柄無(wú)效調(diào)試器里看cbSize與sizeof是否一致圖標(biāo)在氣泡無(wú)返回值 TRUEuFlags漏NIF_INFO斷點(diǎn)檢查發(fā)送時(shí)的uFlags值圖標(biāo)不在氣泡無(wú)會(huì)話 0、圖標(biāo)句柄被提前釋放任務(wù)管理器看會(huì)話 ID檢查DestroyIcon時(shí)機(jī)氣泡出但標(biāo)題空白字符集不匹配看sizeof(NOTIFYICONDATA)與工程字符集設(shè)置時(shí)好時(shí)壞消息循環(huán)被阻塞、定時(shí)器被搶占檢查主線程是否有長(zhǎng)耗時(shí)同步操作特定機(jī)器必現(xiàn)通知開(kāi)關(guān)、專注助手、組策略重置通知設(shè)置為默認(rèn)后復(fù)測(cè)4.3 把什么時(shí)候不彈記錄成日志這一點(diǎn)聽(tīng)起來(lái)平淡但它決定了后續(xù)排查是幾天還是幾小時(shí)。我在托盤模塊里加了一組固定的日志點(diǎn)NIM_ADD的結(jié)果、NIM_DELETE的結(jié)果、每次發(fā)氣泡前的uFlags和dwInfoFlags值、發(fā)氣泡的返回值、當(dāng)前進(jìn)程的會(huì)話 ID 和是否提權(quán)。這些信息加起來(lái)不到二十行代碼但客戶現(xiàn)場(chǎng)出問(wèn)題時(shí)看一眼日志就能把范圍縮小到一兩個(gè)方向。有個(gè)細(xì)節(jié)日志里不要把szInfo全文打進(jìn)去用戶數(shù)據(jù)可能很長(zhǎng)也可能包含不該落盤的內(nèi)容打個(gè)長(zhǎng)度和標(biāo)題就夠了。5. 托管封裝層WinForms 與 WPF 的等價(jià)坑5.1 NotifyIcon.ShowBalloonTip 的前置條件C# 的 WinForms 里NotifyIcon類把Shell_NotifyIcon包了一層接口看著簡(jiǎn)單坑一樣不少。ShowBalloonTip(int timeout)要能生效至少得滿足三個(gè)條件Visible為true、Icon不為null、圖標(biāo)已經(jīng)被系統(tǒng)接受。第一個(gè)條件是硬性的Visible false時(shí)調(diào)ShowBalloonTip不拋異常也不顯示最容易漏。第二個(gè)條件很多人以為只要給Icon賦值就行實(shí)際上如果你是從資源文件動(dòng)態(tài)加載圖標(biāo)流用完順手把StreamDispose掉了Icon對(duì)象的內(nèi)部句柄可能已經(jīng)失效表現(xiàn)就是托盤圖標(biāo)顯示成一塊空白氣泡也跟著不顯示。第三個(gè)條件在窗體生命周期早期容易出問(wèn)題。在Form_Load里立刻調(diào)ShowBalloonTip有些機(jī)器上不生效因?yàn)檫@時(shí)窗口句柄剛創(chuàng)建托盤圖標(biāo)還沒(méi)真正掛上去。穩(wěn)妥做法是Load之后用BeginInvoke推遲到消息隊(duì)列下一輪再調(diào)或者在Shown事件里調(diào)。timeout參數(shù)在 Vista 之后基本被忽略了實(shí)際時(shí)長(zhǎng)由系統(tǒng)的輔助功能設(shè)置決定。這一點(diǎn)和老系統(tǒng)不一樣如果產(chǎn)品文檔里寫(xiě)了氣泡顯示 5 秒最好改成約 5 秒實(shí)際由系統(tǒng)設(shè)置決定免得后面被當(dāng)成 bug 提。5.2 消息泵被堵住時(shí)氣泡會(huì)遲到Shell_NotifyIcon內(nèi)部是通過(guò)窗口消息和任務(wù)欄通信的這意味著它依賴調(diào)用線程的消息循環(huán)。如果主線程正在跑一個(gè)長(zhǎng)耗時(shí)同步任務(wù)比如讀一個(gè)大文件、等一個(gè)網(wǎng)絡(luò)請(qǐng)求、跑一段密集計(jì)算那么即使你在另一個(gè)線程里調(diào)ShowBalloonTip調(diào)用也可能被卡住直到主線程的消息泵重新轉(zhuǎn)起來(lái)?,F(xiàn)象很有迷惑性日志顯示已發(fā)送氣泡但用戶是在幾秒甚至幾十秒之后才看到或者干脆看不到因?yàn)橐呀?jīng)過(guò)了時(shí)效。這類問(wèn)題在后臺(tái)任務(wù)完成時(shí)彈通知的場(chǎng)景里特別常見(jiàn)因?yàn)楹笈_(tái)任務(wù)完成的時(shí)刻主線程往往正在刷新界面。處理辦法是有的把耗時(shí)任務(wù)放到后臺(tái)線程主線程只負(fù)責(zé) UI或者在不依賴NotifyIcon對(duì)象的場(chǎng)景下用一個(gè)獨(dú)立的隱藏窗口在自己的線程里跑消息循環(huán)來(lái)處理托盤消息。后者工程量大些但如果托盤邏輯要脫離主窗口獨(dú)立存活比如主窗口可以關(guān)閉但程序不退出這個(gè)結(jié)構(gòu)反而更清晰。WPF 這邊沒(méi)有內(nèi)置的托盤圖標(biāo)控件社區(qū)里常見(jiàn)的做法是引用 WinForms 的NotifyIcon或者用第三方庫(kù)。第三方庫(kù)如果自己實(shí)現(xiàn)了Shell_NotifyIcon的互操作那前面說(shuō)的cbSize、uFlags、字符集三件事依然適用換語(yǔ)言不換原理。選庫(kù)的時(shí)候可以看一眼它有沒(méi)有處理NOTIFYICON_VERSION_4沒(méi)處理的話右鍵菜單的坐標(biāo)計(jì)算在某些機(jī)器上會(huì)偏。6. 把這套東西做成不容易再出問(wèn)題的結(jié)構(gòu)6.1 用一個(gè)帶狀態(tài)位的發(fā)送函數(shù)收口在項(xiàng)目里我最后的做法是把托盤的添加刪除發(fā)氣泡三個(gè)動(dòng)作集中在一個(gè)小模塊里模塊內(nèi)部維護(hù)一個(gè)bool added狀態(tài)位任何一次NIM_ADD成功才置位NIM_DELETE后清零。發(fā)氣泡的入口函數(shù)第一件事就是檢查這個(gè)狀態(tài)位沒(méi)置位就先嘗試添加一次。這樣不管上層怎么調(diào)用都不會(huì)出現(xiàn)圖標(biāo)沒(méi)了還在發(fā)氣泡的靜默失敗。同時(shí)這個(gè)模塊對(duì)外只暴露一個(gè)ShowBalloon(title, text, level)函數(shù)level是個(gè)枚舉映射到NIIF_INFO、NIIF_WARNING、NIIF_ERROR。這樣上層不需要知道dwInfoFlags的存在后面如果要換實(shí)現(xiàn)比如換成 Toast 通知改動(dòng)面只在一個(gè)文件里。還有一個(gè)小設(shè)計(jì)發(fā)氣泡函數(shù)返回一個(gè)枚舉區(qū)分發(fā)送成功、發(fā)送失敗、系統(tǒng)策略可能抑制三種結(jié)果。第三種判斷不了那么準(zhǔn)可以根據(jù)會(huì)話 ID 和通知開(kāi)關(guān)做個(gè)粗略推斷。有這個(gè)返回值上層在做關(guān)鍵提醒時(shí)就能選擇走別的通道比如閃爍任務(wù)欄、改托盤圖標(biāo)顏色而不是把所有希望都押在氣泡上。6.2 退出時(shí)的清理和僵尸圖標(biāo)NIM_DELETE一定要在窗口銷毀之前調(diào)而且要用和NIM_ADD完全相同的hWnd和uID。我見(jiàn)過(guò)填錯(cuò)uID導(dǎo)致圖標(biāo)刪不掉的情況表現(xiàn)是程序退出后圖標(biāo)還掛在那兒鼠標(biāo)劃過(guò)才消失。這不僅僅是觀感問(wèn)題——?dú)埩舻膱D標(biāo)會(huì)占用那個(gè)uID下次啟動(dòng)如果復(fù)用同一個(gè) ID行為可能不可預(yù)期。另一個(gè)清理時(shí)機(jī)是WM_ENDSESSION系統(tǒng)關(guān)機(jī)或者注銷時(shí)程序不一定能走完正常的退出流程。在這個(gè)消息里補(bǔ)一次NIM_DELETE能減少殘留。還有崩潰場(chǎng)景進(jìn)程直接掛掉不會(huì)執(zhí)行任何清理代碼圖標(biāo)一定殘留這個(gè)沒(méi)辦法只能靠系統(tǒng)自己回收。如果程序支持多實(shí)例uID的分配要小心。兩個(gè)實(shí)例用同一個(gè)hWnd和uID是不可能的hWnd天然不同但如果用了自己生成的guidItem標(biāo)識(shí)兩個(gè)實(shí)例可能會(huì)互相覆蓋。多實(shí)例場(chǎng)景建議用單實(shí)例機(jī)制直接禁掉或者在guidItem里加入進(jìn)程相關(guān)的區(qū)分信息。6.3 版本差異下的降級(jí)策略不同 Windows 版本對(duì)氣泡的處理差異實(shí)際項(xiàng)目里沒(méi)必要逐一適配但有三條底線值得守住。第一條不要在NIM_ADD的時(shí)候一次性把NIF_INFO也帶上試圖順便彈個(gè)氣泡添加和修改分成兩次調(diào)用邏輯清晰出問(wèn)題也好定位。第二條NIM_SETVERSION只在確實(shí)需要 v4 的回調(diào)格式時(shí)才調(diào)調(diào)了就同步改回調(diào)解析邏輯兩者必須一起改。第三條uTimeout不要依賴需要多停留一會(huì)兒的需求用重復(fù)發(fā)送或者改成帶交互的通知來(lái)實(shí)現(xiàn)更好別指望這個(gè)字段。我在實(shí)際項(xiàng)目里的體會(huì)是托盤氣泡這個(gè)功能的問(wèn)題密度和代碼量完全不成比例——二十行代碼的功能可能需要幾百行的排查經(jīng)驗(yàn)來(lái)兜底。所以能把它封裝干凈就封裝干凈別讓業(yè)務(wù)邏輯直接碰NOTIFYICONDATA后面換人維護(hù)或者系統(tǒng)升級(jí)改一個(gè)文件就夠了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
一二三区视频在线观看| 92性色国产午夜福利在线661| 亚洲另类色综合网站| 亚洲**2021在线观看| 久久久久久精品免费看A级| 伊人影院在线理论播放| 人人弄人人摸| 久久嫩草国产成人一区| 男人天堂东京热| 亚洲成?V人片在线观看福利| 久久欧洲| 热思思免费视频| 色吧5亚洲| 久久久久免费少妇| 91美女片在线| 丁香五月激情五月| 96麻豆精品一区二区三区| 蜜乳AV一区| 日逼五月天| 国产成人在线观看网址| 美女诱惑爱爱| 精品对白久久不卡| 女同在线视频一区| 色噜噜国产精品视频一区二区| 欧美日韩国产中文精品字幕自在自线| 久久久久久大| 久艾草在线精品视频在线观看| 98一区二区精品| 亚洲国产97在线精品一区| 无码人妻精品一区二区中文 | 97se综合| 美女诱惑爱爱| 日曰骚久久精品| 99热精品在线| 91爱啪| 曰韩欧美国产传媒麻豆第一区| 欧美线天码中字| 青青国产精品在线| 狠狠操狠狠操操| 激情五月激情综合网| 欧美91网| oumeisetu综合| 国产精品久久aV| 超碰97玖玖爱| 97在线视频网站| 人人操人人摸人 | 色丁香五月婷婷| 97伊人| 精品免费1| A级片日韩欧美国产欧美视频精选观看| 美女刺激久久国产欧美| 无码一区免费在线不卡| 日韩中文字幕宗合在线| 亚洲熟女中文字幕在线| 久9九综合在线| 亚洲丝袜天堂| 久久一区二区三区入口| 国产精品探花色| 91老熟女91老女人| 美女尤物福利视频| 涩涩这里只有精品视频| 一本色道人妻久久| 中文字幕人妻色偷偷久久皮 | 色综合加勒比四四季| 激情五月天插| 欧美色97| 亚洲图片 激情小说| 人妻精品一区二区在线| av激情亚洲五月天| 欧美精品,四区。五区| 久久人人看| 探花精品 一区二区| 国产精品熟女丝袜一区二区| 蜜乳成人AV| 色777999综合| 黄色高清久久无码依人| 97操操| 91老司机精品| 欧美久久婷婷| 日韩乱码Av| 色乱二区| 国产精品又黄又猛又粗| 亚洲蜜臀精品视频久久| 久久有碼| 嗯啊不要啊在线 | 精品久久9| 大香蕉手机在线| 东京太热久久久| 日韩人妻制服丝袜av| 亚洲自拍青操视频| 日日嗷| 920日本午夜免费| 99精品欧美一区二区三区桃色| 国产精品九九| 日韩中文字幕熟妇人妻| 天天日少妇逼AV| 日本视频一区二区三区| 操婢日韩| 亚洲AV色图一区| 亚洲色图20p| 久久精品三级影视| 国产伦乱91| 老司机深夜18禁污污网站| 久久久久女教师免费一区| 亚州国产成人精品女人久久 | 国产午夜激片Av毛片不卡| 日韩欧美大片免费高清啪啪| 久久久久久亚洲Av无码精| 婷婷丁香人妻| 精品无码秘 人妻一区二区| 裸体美女久久久| 男人天堂站| 激情五月综合网| 日韩免费簧片| 亚洲欧美在线丝袜| 外国免费性情大片| 91精品久久久久| 无码人妻毛片丰满熟妇精品区| 啊啊啊啊操死我了| 人妻少妇三级| 日韩不卡一二三四| 超碰偷拍| 国产成人五月天丁香花| www.人人摸在线视频| 曰本道人妻久久久在线不卡色视频| 色综合20p| 激情四射五月天| A啊啊在线观看| 台湾肥佬网一区二区三区| 日本天天吊| 欧洲乱码一区二区| 熟妇人妻一区二区三在线| 亚洲五区熟女| 一区二区三区无卡视频在线观看| 亚洲一区二区专区-国产丝袜精品丝袜-成人AV | 91精品人妻偷情| 性暴力欧美猛交在线直播| 亚洲精品国语在线播放| 欧美亚洲色图另类国产| 五月天玖玖资源站| 97一区二区蜜臀| 98精品国产乱码久久久久久| 青青草在线视频美女| 性色高清..……| 婷婷10月天青娱乐| 欧美在线91| 亚洲性爱乱操x| 久久riav中文精品| 大香网站| 日韩欧美亚洲国产日韩| 狠狠图片青青草| 91人妻久久久久久久久久久久久| 精品人妻高清麻豆av| nuu12国产麻豆精品| 大香蕉99re| 中文字幕在线免费观看 | 激情文学网伊人| 强上我不卡卡| 亚洲中亚日激情视频| 亚洲男人天堂网站| 嫩草美女久久| 天天日日夜夜| 91日产欧美| 婷婷五月天色网| 欧美亚洲| 自慰白浆在线观看| 激情六月婷婷| 日韩资源网| 性一级黄色录像片网站导航| 啪一啪免费视频| 97超碰jingpin| 日韩在线女优天天干| 欧美大战久久久伊人| 国产精品一区二区后入| 98久久超碰| 99久国产精品午夜性色福利| 精品超碰国产| 97天天操天天干| asc国产精品| 麻豆视频国产一区二区| 六月丁丁香| 欧美亚洲激情小说| 岛国天天午夜影院传媒网| 人妻色偷色噜| 亚洲最大91网| 欧美高清色| 亚洲AV性爱电影| 天操天操夜操夜月操月年年操| 久久久久久久六六 | 亚91亚洲网| 夜夜青青无码影院| 亚洲成人免费中文字幕| 中文字幕一区 二 区 三 四 五 区日 日 骚 | 亚州欧美一区| 亚洲精品国产熟女| 91精品人妻一区二区三区蜜桃臀| 国产精品农村妇女| 亚洲AV永久无码一区仙野| 91色图片| 午夜性生活av免费在线看| 婷婷综合网| 欧美第一页| 色香天天| 色婷婷激情| 久草毛片| 欧美99热| 婷婷丁香人妻 | 无码九九| 黄色AAAAA欧美| 免费观看有码高清视频| 欧美精品一二三| 综合色99| 欧美97爱| 久久这里精品国产99丫e6| 久久久久久久人妻丝袜| 大香蕉男女超碰精品在线| 99视频自拍区| 免費黃色視頻觀看一| 综合九九| 操屄不卡视频| 91在线丝袜| 国产第25页在线观看| 欧美久久人妻少妇一区二区| 狠狠色噜噜狠狠狠狠狠色综合久久 | 99re28在线观看| 中文字幕 国产 精品| 9997se| 亚洲午夜福利视频| 欧美日韩系列| 九九成人| 色色毛片| 国产av色网| 色婷婷丁香| 久草免费在线视频| 青青欧美在线| 波多野结衣一级视频| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 国产乱婷婷精品二区三区| 欧美成人性活片| 天无日色综合| 9色国产精品一区粉嫩| 激情第四色| 欧美一级A一级a爱片久久| 男人兔费天堂| 免费自拍三级综合| 久久久久久久久久久精| 蜜桃视频精品一区二区| 国产不卡免费在线视频| 伊香蕉综合久久久久久久噜噜噜| 日韩av熟女一区二区三区成人| 色吧5亚洲| 四虎在线播放| 夜色五月天| 无码外流操逼视频| 91美女视频直播| 久都青青视频| AA级电影三区| 亚洲,欧美,综合网| 精品国产一区二区久久| 国产AV激情无码久久无码| 东北老熟女| 精品免费1| 日韩免费大片一级播放| 日韩熟女精一区二区三区不卡| 色婷婷网| 青青青国产手线观看视频2| 亚洲色情在线影视| 大香樵伊人网| 国产91精品福利在线| 国产少妇内射| 亚洲精品欧洲精品| 思思99热| 欧美一区二区亚洲天堂| 大香蕉www.超碰| 国产综合久久久鬼色| 亚洲h片在线免费观看| 巨乳特殊服务按摩| 啊啊啊啊啊操我视频| 性做久久久久久免费观看软件| 亚洲色图综合| 午夜精品久久99蜜桃的功能章节| 久九九九九九九九热| 熟妇人妻一区二区| 国产视频一区二区在线观看| 制服乱伦| 色吧综合网| 国产精品毛片?v一区二区三区 | 久久久天堂| 国产精品老熟女一区二区| 国产精品自在自拍视频| 欧美性爱无码一区二区三区| 一本色道久久天天射天天干| 久久久新亚洲AV| 蜜桃在线观看一区二区三区| 99熟女| 曰韩精品视频一区二区| 粉嫩av平台| 熟女人妻精品一区二区视频| 九久久精品| 99re99视频在线免费观看| 久久久久国产亚洲一区欧美色图日韩| 激情第四色| 激情五月综合网| 人人操人人摸人| 日韩精品一区二区日韩| 成人性爱AV在线免费观看| 天堂v无码免费视频| 亚洲综合首页| 啊啊啊久久| 精品国产乱码久久久| 亚欧操逼片在线观看 | AAA久久| 日本一区二区三区四区免费观看| 久操网址| 日本三级R| 亚洲最新a在线观看| 黄色大片免费在线| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 嗯嗯啊啊的视频| 嗯,啊。舔我逼| 久偷拍欧美日韩三区| 操一区| 992这里有精品| 五月丁香久久| 97色欧州| 久久久精品视频欧州站| 国产精品另类| 久久人妻| 噜噜噜在线视频| 秋霞久久亚洲精品成人| 国产精品亚洲一区二区三区四区 | 日日操免费视频| 日韩综合无码色欲vv| 国产精品人妻一区二区| 国内偷自视频区视频综合| 18禁免费视频| 99久久综合网| 人人澡人人爽人人精品| 99啪| 久久九七| 97美日韩视频| 精品人妻一区二区三区四区石在线| 草草草视频在线免费看| 亚洲制服aⅴ中文字幕| 精品国产www久久| 成人午夜无码视频| 日本污ww视频网站| 一区二区三区国产精产| 天天射夜夜| 亚洲无码一区成人免费午夜| 婷婷色色五月天福利| av在线不卡一区二区三区| 在线看免费无码AV天堂的| 婷婷丁香久久| 视频二区熟女人妻| 97亚洲在线| 伦激情人妻另类人妻| 人妻熟女av国产网站| 色妺妺在线视频| 久草热制服丝袜在线观看 | 成人网址在线观看| 日逼五月天| 91情色在线| 伊人一区二区在线播放| 天天爽天天爽| 久久久成人精品| 国产精品另类一区大香蕉| 人人天天欧洲| 少妇人妻激情四射| 精品国模无码| 二色av| 嫩草伊人久久精品| 亚洲无码日韩电影| 无码操逼网| 伊人久久青青草| 欧美激情精品久久久| aa片毛片| 日韩人妻资源在线看| 熟女高潮合集-永久久久-成人AV| 亚洲天堂男人的天堂| 黄片在线免费在线观看| 男人的天堂,欧美亚洲另类国产日韩,日本高清一区二区 | 色眯眯av| 999综合网| 九九激情网| 欧美91久久久久| 诱惑网综合| 日韩一级片在线看| 天天天操天天天爱| 欧美综合娱乐久久| 亚州精品丝袜-不卡成人免费| 日曰骚久久精品| 蜜乳性色无码专日粉嫩骚逼AV| 性感女人网页在线观看视频| 2017天天插| 人人妻人人狠人人| 91网站视频在线观看| 欧美Ⅴ性爱| 欧美成人9797| 国产精品久久aV| 观看免费区二区三区二| 亚洲日韩视频二区| 欧亚日韩三区| 欧美日韩啪啪电影| 黄色小说亚洲| 欧美亚洲国产91在线| 亚州AV无码国产精品| 97久久久精品| 亚洲 一区二区 自拍| 免费超碰97久久| 少妇啪啪自拍| 丝袜色综合| 亚洲无码一二三区| 欧美综合传媒| 激情综合五月| 亚洲欧美色图小说| 熟妇精品juliaannAV| 91大神精品长腿在线观看网站| 中文字暮97| 亚洲男人天堂网| 国产视频一区二区在线观看| 91精品无码久久久久久久| 日本不卡三级网在线播放| 少妇精品| 亚洲情色五月天| 2018天天日天天日| 久久久久幕乱码| 91粉嫩萝控精品福利网站_精品影音先锋国| 4虎在线视频| 一,爱啪啪,在线免费视频| 视频二区熟女人妻| 日本大片日本一区二区免费高清| 色婷婷久久| 这里只有精品97| 亚洲另类色图片| 涩涩这里只有精品视频| 国产精品97视频| 九九精品美女高溯喷水| 欧美不卡二区| 精品天堂| 欧美日韩青操| 亚洲欧美精品一区天堂久久| 黄片免费日韩| 亚洲天天精品| 99热精品青草在线| 日日碰狠狠添天天爽超| 日韩啊V| 加勒比人妻综合| 婷婷五月天福利| 中文字幕人妻资源在线| 国产AV线| 久久这里精品国产99丫e6| 亚洲αv一区二区三区| 欧美一区二区| 神马久久69| 伊欧美综合视频| 91超碰在线| 欧美性暴力猛交XXXX | 自拍偷拍国产欧美日韩韩| 中出20p| 欧美大香蕉97| 久久极品伊人| 韩国黄色片精品久久久| 国产人妖的免费的视频| 久操国产在线| 国产熟女高潮一区二区三区| 99国产精品在线观看| 果冻国产精品麻豆成人av| 高潮精品| 亚洲色婷婷综合久久久久中文| 中国黑人三级片网站上区| 亚洲天堂久久| www成人啪啪18秘 免费| 乱伦熟女论坛| 97日韩| 日韩欧美麻豆| 制服丝袜第二页| 91色噜噜狠狠| 伊人综合色网| 少妇超碰在线| 99久久99九九99九九九| 亚洲一区二区三区AV无码| 2020中文字幕在线观看| 成人A片男人的天堂| 男人天堂2019亚洲| 日本久久精品| 国产精品视频精品一二| 久操网线| 天堂中文日本在线观看| 国产精品久久久久久无码红治院| 激情黄色片在线观看| 99热在线播放| 人人操人人肉久久精品| 亚洲黄色AV电影| 亚洲做性| 天干天干天干天天做| 亚洲国产丝袜在线观看| 加勒比海成人视频网 | 91人妻Pr| 日韩无码专区| 五月天婷婷色色| 亚洲精品三| 新版天堂中文资源8在线| 人人摸人人干人人拍97| 无遮挡h肉动漫在线观看| 大香网站| 无码国产精品午夜不卡(| 欧美日韩操逼动图| 男人a天堂手机在线版| 亚洲第一黄色av网站| 91在线视频免费播放| 一类无码操逼视频| 青娱乐亚洲自拍| 欧美日韩国产高清在线一二三区| 久久久麻豆精品| 日韩人成网站在线播放| 五月婷婷AV| 九月色婷婷| www久久99| 婷婷久久网| 天天操天天射青青草| 高清不卡国产| 伊人亚洲综合| 97天天| 成人毛片免费| 人人潮人人摸| 日韩性爱播放| 国产一区二区三区不卡手机在线| 麻豆伊人网| 男人天堂网手机版婷婷| 精品少妇99| 91欧美www| 色与欲影视天天看综合网| 夜夜躁狠狠躁日日躁av| 欧美亚洲国产91在线| 成人无码电影在线观看网| 欧美另类综合久久| 大香蕉免费中文| 天天综合网91入口| 997色在线| 国产精品久久久久久久久久久久| 国产一区二区三区白丝| 黄网色一区二区三区四区精品| 丁香六月啪啪| 一本大道综合伊人精品热热| 婷婷激情丁香| 国产黄色影片在线观看| 69精品人人人人| 欧美色997| 桑老女人九区| 秋霞操逼片| 久久激情视频| 白 大 人妻 区 在线| 国产激情在线| 很很操在线| 日本黄色精品专区网站| 五月婷婷性爱| 人妻熟女一区二区| 日韩精品资源专区二区| 九九RE视频在线精品| 97玖玖超碰| 国产丝袜啪啪| 国产懂色精品国产av| 九九久久首页| 天躁夜夜躁2021| 亚洲第一狼人丝袜美女另类 | 日本性感人妻91| 激情av| 午夜综合在线| 欧美人人曰人人操人人射射| 91 亚洲 欧洲| 成人九九| 日本操逼视频不卡直接放| www成人啪啪18秘 免费| 男人的天堂2010| 九九人妻| 亚洲乱码国产乱码精网站| 久久人妻四季| 久久啊啊| 五月天婷婷久久| 熟女露脸激情自拍视频| 日韩精品一区二区日韩| 欧美性色综合网| 热99这里有精品综合久久| 青娱乐亚洲自拍| 天堂国产AV| 色哟哟 日韩精品| 人妻激情偷乱视频一区二区三区 | 国产精品免费视频人成| 国产后入内射| 欧美一级久久久久久久大片动画| 亚洲熟女综合| 在线视频免费观看午夜| 男人亚洲91首页在线| 超碰伊人在线| 无码视频黄色网战| 天天综合网亚洲综合网| 97任你吞精| 欧美专区17页| 色情五月丁香| 日韩内| 嗯嗯嗯好爽| 97精品免费| 玖玖人人爱| 97超碰人人模人人拍人人| 九九热男人天堂| 欧美综合亚洲综合| 成年男人的天堂| 天堂69亚洲精品中文字| 中文字幕免费观看| 日韩国产欧美伦理在线| www. 男人天堂成人在线| 51一区二区三区| 小骚逼被操的爽不爽| 一区二区影院| 欧美日韩亚洲少妇寂寞影院正在播放 | 中文字幕欧洲有码| 91久久久久免| 91精品无码久久久久久久| 日韩钢筋无码高清啾啾啾| 日本操逼视频不卡直接放| 国产地址二三| 亚洲欧美日韩夜夜| 亚洲天天操| 中文字幕丝袜人妻| 久久黄色视频一区二区三区| 中文字幕第23区| 国产视频一区二区免费| 精品一区二区三区18| 激情五月天网站| 无码人妻一区二区三区四区老鸭窝| 国产玖玖| 少妇人妻好深太紧了vr91| 久久久91福利姬| 亚洲国产精品久久久久久久久久| 1000部熟女视频在线观看| 久久久久国产| 人妻激情另类| 国产av又色又爽又黄| 少妇高潮九九九九九九九| 久无码| 久久久精品视频免费观看| 婷婷激情四射| 一二三四视频在线社区中文字幕| 91综合在线| 亚洲国产av中文字幕久久| 深夜激情| 国产乱码精品久久久久久| 丁香色婷婷| 国产精品国产自产高清AV| 伊人九九九| 天天综合影院91| 美国一区二区三区视频| 亚洲欧美情色| 伊人9| 老师充足的奶水小说| 日韩av乱伦| 日韩黄片视频试看| 97亚洲欧美| 欧亚韩国999| 色综合加勒比四四季| 五月天色色色| 秋霞一级鲁丝片A片| 欧洲站一级二级三级h| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 在线日韩精品一区二区三区| 国产97在线播放| 精品一区二区麻豆| 18一区二区三区| 亚洲色图亚洲无码强奸乱伦| 欧美高清无码免费视频高清版| 欧美性爱一区二区三区| 国产风韵犹存熟妇三区| 91久久久视| 啊啊啊 在线观看| 色狠狠综合| 性爱乱伦网址| 国产51色综合久久免费| 中日韩久久久免费看| 性爱AV天堂| 人人操天天爽| 97超碰国产亚洲精品资源| 任你爽视频| 亚洲精品中文字幕一区在线视频| 台湾成人无码AV| ,成人免费啪啪视频| 又大又大又大又粗爽高潮观看| 人妻另类| 亚洲一区二区中文字幕| 男人天堂久久精品不卡| 亚洲熟妇图片| 91九色在线| 免费久久精品麻豆一区二区av| 伊人网综合在线视频| 高潮毛片无遮挡高清免费| 狠狠久久手机视频精品| 精品人妻一二三| 思思热一热婷婷热一热| 91精品国产91久久福利| 大屁股人妻女教师撅着屁股| 久久AV无码AV| 欧美色图另类图片| 天天欧美| 亚洲国产综合图区中文字幕| 亚洲成人贴图| 亚洲一区二区三区春色| 日本黄色精品专区网站| 中文字幕五月婷婷免费| 激情抓乳插进去啪啪啪日韩| 国产成人自拍视频视频| jizzjizz欧美| 国产男女无套视频免费观看| 亚洲精品视频在线播放| 久久久爆乳翘臀一线天伦理视频| 日韩黄色电影网站| 五月天婷婷色| 中文字幕老熟妇黄色视频| 97干在线视频| 久久超碰久| 桃花色涩综合影院| 天天日天天插| 亚洲国产剧情少妇激情| 国产美女激情| 欧洲大香蕉| 亚洲综合嫩| 青娱乐国产剧情av一区| 国产一级特黄大片处女| 亚洲国产麻豆一区二区三区| 日本肏逼视频在线观看| 天天看综合网| 欧美性爱网97| 亚洲中文sv| 秋霞 色色| 天天综合网日韩7799| 亚洲古典另类欧美在线| 国产区91柔拿会所技师| 六月丁香啪啪啪| 伊人国产av| AV在线播放网址| 亚洲天天更新| 黄色电影在线播放综合网站| 欧美一区二区三区蜜桃| 六月婷婷综合| 亚洲自拍一区夜夜操| 免费啊啊啊| 亚洲激情深爱文学小说网站| 狠狠爱综合网| av无码av无码专区| 亚洲人妻av| 中文字幕二区日韩天堂 | 日本 欧美 亚中文字幕| 97超碰免费人人性爱| 中国91AV| 亚洲精品国语在线播放| 岛国毛片在线观看免费| 九月色婷婷| 天天内射| 蜜桃av色偷偷av老熟女| 强奸乱伦中文字幕AV| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 欧美熟妇色| 亚洲免费成人在线高清无码视频| 九九热最新| 天天综合网~91综合网| 日本孕妇一区二区视频操逼免费看| 亚洲最大网站av| 亚州综合电影| 啊啊啊网站| 一级久久性爱视频| 99热 按摩 日韩| 91综合色| 亚洲五码一区二区三区| 怡红院视频在线| 欧美在线第五页| 亚洲伊人a线观看视频| 伊人影院在线理论播放 | 狠狠色婷婷7777久| 91女优在线观看 | 欧亚不卡| 亚洲九九九| 艹精品| 啊啊啊好舒服好爽啊啊啊视频| 热久久无毒不卡| 黄色片一区二区三区四区五区| 日本 成 人 小说 电影 一区二区| 91中文字幕在线观看| 中文字幕一区电影在线观看| 97露脸精品丝袜| 欧美97超碰| 中文激情网| 久久一二三四五六七八九区区| 在线日韩精品一区二区三区| 久久久艹艹艹| 91色香| 人妻天天操天天爽视频免费| 亚洲毛片久久| 国产玖玖| 91成人无码| 久热这里| 中文字幕三四区| 欧美九九爱| 97精品一区二区三区免费| 中文字幕av亚洲在线| 日韩黄色小说| 青椒国产97在线熟女| 夜夜操中文字幕| 国产自产一区视频在线| 亚洲精品人伦一区二区| 国语av最新自产拍在线观看| 91精品操美女| 国产一级作爱毛片| 欧美色亚洲色| 精品国产乱码久久久久久口爆网站| 亚洲麻豆18发?| 欧美人人AAA| 制服丝袜第二页| 日本性爰一道本| 天综合网欧美| 极品尤物在线观看| 欧美性爱一区二区三区| 一区二区你上我| 亚洲成人激情小说视频| 欧洲乱码视频| 久久久久国产精品片区无码直播| 色香综合天天影视综合 | 97爱| 欧美精品偷拍| 国产乱伦性爱区| 亚洲欧美日韩国产丝袜自拍中文| 中文字幕成人理论在线| 中文字幕一区二区三区四五区| 91校园春色长篇| 亚洲无码 国产无码| 屌妞视频久久久久久久久久久久| 操逼逼中文字幕| 97欧美日韩精品| 久久久艹艹艹| 青青青国产手线观看视频2| 粉嫩小泬久久久一区二区| 国产一区二区在线电影| 91亚洲综合| 最新av在线| 色综合色综合网| 黑人精品XXX一区一二区| 久久伦理视频久久大香蕉视频| 久热伊人| 无码区蜜乳| 亚洲 欧美 第一页| 青青草黑寡妇男人天堂| 久久精品国产72国产精品福利| 国产精品一二三| 熟女中出视频| 99re在线观看| 日韩国产欧美伦理在线| 78操B| 黄网站黄视频网站进入口| 极品白嫩美女白浆成人福利在线看| 九九久久玖玖| 91在线国产后入风骚翘臀美女素人| 97天天爽| 丰满人妻无码一区二区三区 | 国产av高清版| 日日日日做夜夜夜夜无码| 日韩无码第3页| 做爱福利视频一区二区| 国产剧情一区在线观看| 日逼国产| 中文字幕乱码人妻二区三区| 丝袜美腿操av| 超碰日韩美妻| 久久久久久久久久久久黄色 | 久久久com| 999岛国大片| 亚洲综合另类小说色区亚洲成av人片在www | 伊人网免费视频| 美女高潮国产高清| 亚洲涩图欧美| 神马久久久久久久久久| 校园春色制服丝袜中文字亚洲| 乱伦色图网址是多少| 日本久久超碰| 91丝袜人妻| 嗯嗯啊啊的视频| 亚洲人妖网| 日韩婷婷| 久久99午夜精品一区人妻| 嗯啊免费视频| 五月天婷婷激情| 美国一区二区免费视频| 97人人操人人摸| 男人的天堂2019AV| 男啪女色黄无遮挡免费观看| 一区二区三区 丝袜高跟| 久久性爱网站| 一起草高清无码| 91路www| 六月激情网| 欧洲在线性爱视频| 日日干夜夜骑| 18一区二区三区| 极品尤物女神在线观看| 91欧美综合| 国产精品久久久久久久久久久久久久久| 顶级丝袜熟女一区二区三区 | 96爱综合| 国产视频一区二区免费| 国产色产精品在线观看| 日韩亚洲97| 日本精品88888888| 亚洲欧美中文一区二区三| 日本欧美不卡| 蜜桃视频一区二区三区| 国语av最新自产拍在线观看| 久久精品—区二区三区内射| 亚洲999综合| 四虎影库国产精品免费| 国产亚洲欧美每日在线| 久久系列| 欧美后入式| 狠综合网| 亚洲中文字幕av| 中文字幕99999| 春色综合免费| 日本五十路在线| 亚洲综合网电影91| 99久久久无码国产精品性男| 久久天天艹| 3PAV乱伦视频| 亚91网| 校园春色家庭伦理欧美激情| 国产又大又粗又长视频在线| 亚洲高潮少妇| 91粉嫩萝控精品福利网站_精品影音先锋国 | 青青草好吊| 综合久久99亚洲人妻中文在线| 91在线免费观看处女| 一区二区三区在线资源| 操逼网站视频漫画国产| 极品白嫩美少妇在地板上位骑射淫水泛滥| 香蕉大久久久| 中文字幕久久精视频久久大全| 混色激情av| 久久久久免费少妇| 成人av免费观看| 午夜AV人气不卡| 天天躁日日躁AAAAXXXX国产 | 亚洲爽图| 久久少妇| 欧州91高潮| 久热伊人| 人妻超碰青青草98| 亚洲国产精品久久久男人的天堂| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 亚洲精品久久久久久| 大香蕉啪啪网| 夜夜欧美 | 91欧美偷拍| 日本女厕偷拍| 欧美亚洲影视| 精品无码一二三四区| 国产亚卅97| 妇女视频网站| 日韩 女同 综合| 超碰这里有精品| 久久久久久久| 九九九九热| 婷婷久久五月综合激情| 99久久久无码精品国产人| 成人日韩3| 97久久超碰国产精品| 乱伦强奸区日韩| 久久中文字幕一区不卡| 黄片视频观看| 久久久久亚洲?V片无码V| 日韩国产乱子伦App| 九九成人视频| 久久亚洲不卡一区二区三区 | 小情侣高清国产在线视频| 五月天丁香网| 强奸乱伦Av网| 国产精品一区二区三区在线密挑| 熟妇人妻一区二区| 91久热| 丁香五月天婷婷姐| 蜜屁Av| 欧美亚州色的图| 青青在线视频日韩欧美| 精品国产91内射久久| 99精品成人免费看| 日韩人妻少妇 一区二区三区| 性爱视频久久| 99综合自拍| www.acm成人黄色毛片| 国产精品自拍视频| 一本精品日本在线视频精品| 亚洲综合九九| 五月丁香啪啪啪| 99r九九| 欧美少妇一区二区三区| 亚洲日韩黑丝| 中文字幕丰满人妻日本| 欧美性爱视频免费一区一A | 懂色AV一区二区三区| 97超视频在线观看| 欧美姓爱综合网| 亚洲免费成人在线高清无码视频| 免费看日本操逼视频| 青青草视频在线观看一区二区| 大香蕉伊人在线成人AV在线观看| 97 国产精品| 精品成人无码| 五月丁香六月激情| 大香蕉欧美国产日韩高潮| 操人妻视频| 人人操人人摸人| 五月婷婷激情| 久草精品一区| 最新无码国产| 丁香五月偷拍| 亚洲人码13| 色综合国产在线观看| 国产精品岛国片在线观看| 超碰97色色| 941超碰| 成人av影院在线观看| 吻戏激情性巴克| 偷拍新久久| 青青免费在线视频一区 | 97干在线看| 色偷偷超碰亚洲| 亚洲AV麻豆Aⅴ无码电影一| 亚洲1区| 97在线播放| 欧美成人AⅤ大片在线观看| 爱干爱射网啊啊啊| 91爱| 99只有精品| 亚洲精品97久久中文字幕| 欧美日韩在线小说| 制服乱伦| 四虎影视 亚洲无码| 亚洲一区日韩| 免看60秒涩涩视频| www.色婷婷色综合| 91久久国产精品| 五月丁香啪| 91老熟女视频| 天天摸夜夜摸| 国产强奸乱伦无码视频| 精久久久91| 性久久| 亚洲久草AV色图| 久热9| 大香蕉2017| 综合熟女| 国产兽交视频在线播放| 久日91在线| 国产精品嫩草影院免费| 人妻日日夜夜精品| 一区二区三区美女超清| 亚洲美欧999| 亚洲色图尤物视频| 超碰中文字幕人妻草一区| 久久人妻少妇| 欧美成人午夜免费福利785| 一区二区播放| 五月天大香蕉| 97精| 欧美狠狠弄| 成人无码电影在线观看网| 97超级欧美| av毛片aaaaa免费看| 四虎视频在线观看| 一区操逼日比视频| 国产精品午夜精品| 欧美国产日韩清纯唯美| 亚洲欧美色图片| 在线人妻熟女一区二区三区四区五区| 放黄片放3级黄片没穿衣服| 五月丁香影视| 欧美色九九| 四虎永久在线精品免费网址| 日韩中文字幕国产| 欧美 亚洲 综合 制服 另类| 久草视频在线视频在线视频在线观看| 亚洲文学偷乱拍啪啪啪啪 | 欧美色图自拍| 96AV精品| 永久免费av无码网站国产app| 欧美91网站| 丰满人妻一区二区三区| 亚洲97成人在线观看| 亚洲日韩熟女人妻高清在线| 国产精品久久久久亚洲av| 99精品无码| 欧美色图片91| 一本一道vs波多野结衣| 少妇熟女一区二区三区| 欧美大香蕉97| 密桃99999| 天天做天天爽| 午夜啪啪片| 日本阿v天堂在线观看| 蜜臀久久99'精品久久久| 美女啊啊啊啊pc| 日本色色色视频| 51国产午夜精品视频| 抽插亚洲无码| 国产日韩人人| 激情一区二区三区在线观看| 亚洲国产麻豆一区二区三区| 精品久久久久久AV无码| 俺去啦自拍| 亚洲日韩熟女人妻高清在线| 一个人在线看的黄色电影网站| 浪人综合网| 亚洲一区日韩精品| 91超碰在线| 嗯~啊~轻一点 视频| 亚洲诱惑| 精品然女一区二区| 啊啊啊啊啊操我视频| 国产成人无码网站在线视频| 天天躁日日躁xxxxx| 伊人一区二区在线播放| 欧美中文综合| 9Ⅰ超碰| 91n处女在线观看| 国产日韩美女小穴视频网站不卡| 欧美国产成人在线| 亚洲精品国产精品乱码不卡| 亚洲伊人久久精品狠狠在线| 97天堂| 久热超碰| 99精彩视频| 日韩有码免费视频| 99色色网| 丁香五月性| 99热综合| 婷婷五月花| 亚洲中文字幕三级在线| 国产又粗又长又爽又色| 亚洲日韩国产欧美综合v| 国模无码一区二区三区在线| 国产av又色又爽又黄| 逼逼逼逼操操操操操操操操操午夜剧场| 色综合久久av| 精品人妻av在线播放| 两女互慰AV高潮喷水在线观看| 天天视频网站黄| A一区片| 国产精品视频自拍在线| 97精品一区二区视频| 丁香五六月啪啪| 一区不卡在线观看av| 1人人看人人摸人人操| 国产精品久久久久久久毛片1| 人人摸人人添人人操| 国产福利精品最新在线| 亚洲欧美国产其他二区|