• 歡迎訪問奇跡の海網站,本站不上傳任何資源,所有資源均來自于網絡,歡迎加入奇跡の海~!奇跡の海-WordPress QQ群
  • 本站下載資源為網絡上收集整理而來,并且以計算機技術研究交流為目的,版權歸原作者所有,僅供大家參考,學習,不存在任何商業目的與商業用途.
  • 本站系統鏡像均來自于官方原版,ed2k可視為P2P下載鏈接。所有操作系統默認均為試用版,如有正版密鑰可以有效激活,本站不提供任何激活和相關服務。

刪除任務欄鎖定,任務欄圖標的位置,查找可行性文件的方式

其他優化 奇跡の海 3年前 (2017-02-18) 542次瀏覽 已收錄 0個評論 掃描二維碼

刪除任務欄快捷圖標的問題。本來想著應該挺簡單的,估計是在注冊表或者C盤的某個位置放置著一個鏈接,一刪除就可以搞定。沒想到沒那么簡單。

C:\Users\LeoLi\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar這個目錄下放的就是任務欄中的快捷方式。我之前以為只要把這個地方的lnk刪除了,就相當于去掉了任務欄快捷圖標,但是結果還是存在,只是你點擊的時候系統提示該鏈接已失效。看來這個方法是行不通的。
網上去搜資料,發現有篇介紹任務欄列表的文章:http://www.codeproject.com/Articles/36561/Windows-Goodies-in-C-Jump-Lists。這篇文章不是介紹如何刪除任務欄鎖定,而且介紹了為什么我們在任務欄的圖標上右鍵的時候,會看到很多額外的信息,都是程序自己加上去的。所以可以適當的了解下。然后其實了解了這塊內容,刪除任務欄鎖定就不是什么難題了。代碼如下:

bool UnLockWinTaskBarLink( const String runPath )  
{  
    HINSTANCE hModule = ::LoadLibrary(_T("Shell32.dll")) ;  
    if (hModule == NULL)  
    {  
        return false ;  
    }  
    typedef HRESULT (__stdcall* SHCreateItemFromParsingName)(PCWSTR pszPath, IBindCtx *pbc, REFIID riid, void **ppv) ;  
    SHCreateItemFromParsingName mySHCreateItemFromParsingName = (SHCreateItemFromParsingName)GetProcAddress(hModule, "SHCreateItemFr        omParsingName") ;  
    if (mySHCreateItemFromParsingName == NULL)  
    {  
        return false ;  
    }  
    bool result = true ;  
    do  
    {  
        CComPtr<IShellItem> spItem ;  
        HRESULT hr = mySHCreateItemFromParsingName(  
        runPath.c_str(), NULL, IID_PPV_ARGS(&spItem)) ;  
        if (FAILED(hr))  
        {  
            result = false ;  
            break ;  
        }  
        CComPtr<IStartMenuPinnedList> spStartMenuPinnedList ;  
        hr = CoCreateInstance(CLSID_StartMenuPin, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&spStartMenuPinnedList)) ;  
        if (FAILED(hr))  
        {  
            result = false ;  
            break ;  
        }  
        hr = spStartMenuPinnedList->RemoveFromList(spItem) ;  
        if (FAILED(hr))  
        {  
            result = false ;  
        }  
    } while (false) ;  
    FreeLibrary(hModule) ;  
    return result;  
}  

代碼的邏輯應該是不用多說,就是利用Shell32.dll的導出函數SHCreateItemFromParsingName,系統對每個任務欄鎖定都相應的記錄,通過這個程序的可執行文件的位置,我們可以得到一個操作這個程序的“標識”,便于去刪除。
其實我多次看到Shell.dll的調用,這是一個很有用的dll,提供了很多操作系統的方法,我網上找了下這方面的總結,比較少,等以后用的多的再繼續更新。

現在的問題似乎解決了,但是不要忘記,這個函數需要一個參數,也就是被刪除任務欄鎖定的可執行文件的位置。這兒可能很多人都說,直接獲取當前路徑不就完了嗎?有現成的API。但問題是,如果要你刪除的不是你自己的程序呢,隨便給一個程序,讓你解除任務欄綁定,你怎么去找到這個程序的exe的位置呢?

我之前的思路是系統肯定知道所有exe的位置,那注冊表里有記錄,可以直接找了半天沒什么收獲(其實確實有的,稍后說)。那最直接的辦法就是全盤搜索,耗時巨大。一般來說程序的安裝目錄不會有太多層,我們遍歷個7,8層應該都是可以檢索出來的。而且還可以優先遍歷某幾個很有可能的文件夾,這樣的設計顯然不好。于是就想了個歪點子,我們能找到快捷鏈接的位置,右擊快捷方式不是可以看到目標位置嗎?那有沒有辦法獲取到快捷方式的信息呢?答案是:有的。代碼如下:

BOOL GetIEQuickLaunchPath(TCHAR *pszIEQueickLaunchPath)  
{  
    LPITEMIDLIST ppidl;  
    if (SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &ppidl) == S_OK)  
    {  
        BOOL flag = SHGetPathFromIDList(ppidl, pszIEQueickLaunchPath);  
        ::wcscat_s(pszIEQueickLaunchPath, MAX_PATH, _T("\\Microsoft\\Internet Explorer\\Quick Launch"));  
        CoTaskMemFree(ppidl);  
        return flag;  
    }  
    return FALSE;  
}  
  
bool SearchExePathByLnk(String StrTargetFile, WCHAR* szDesEXEPath)  
{  
    ::CoInitialize(NULL); //初始化COM接口    
    IShellLink *psl = NULL;  
  
    HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID *)&psl);  
    if (SUCCEEDED(hr))  
    {  
        IPersistFile *ppf;  
        hr = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf);  
        if (SUCCEEDED(hr))  
        {  
            hr = ppf->Load(StrTargetFile.c_str(), STGM_READ);    //加載文件    
            if (SUCCEEDED(hr))  
            {  
                WIN32_FIND_DATA wfd;  
                psl->GetPath(szDesEXEPath, MAX_PATH, (WIN32_FIND_DATA*)&wfd, SLGP_SHORTPATH);  //獲取目標路徑    
                return true;  
            }  
            ppf->Release();  
        }  
        psl->Release();  //釋放對象    
    }  
    ::CoUninitialize();   //釋放COM接口    
  
    return false;  
}  
  
  
    String StrTargetFile;  
    PIDLIST_ABSOLUTE pid;  
    TCHAR szDocument[MAX_PATH + 1] = { 0 };  
    WCHAR szDesEXEPath[MAX_PATH] = L"";  
  
    GetIEQuickLaunchPath(szDocument);  
    StrTargetFile.append(szDocument);  
    StrTargetFile.append(_T("\\User Pinned\\TaskBar\\"));  
    StrTargetFile.append(_T("酷我音樂.lnk"));  
     
    SearchExePathByLnk(StrTargetFile, szDesEXEPath);  
    UnLockWinTaskBarLink(RCString(szDesEXEPath));  
    DeleteFile(StrTargetFile.c_str());  

上面的代碼中,通過lnk查找可執行文件的位置是參考的是另一位博友的博客:點擊打開鏈接 http://blog.csdn.net/yoie01/article/details/8688686 。只要任務欄有鎖定,那么%AppData%Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar中就一定有這個快捷方式,那這樣的話,問題就解決了。
當然這不是什么好方法,后來我找到了注冊表里關于信息的記錄。在一個項名為Uninstall的下面,這個項有兩個地方,不固定某一個,所以需要都檢索一下,具體位置是:

HKEY_LOCAL_MACHINE, _T(“SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall ;
HKEY_LOCAL_MACHINE, _T(“Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall 。
找到這個地方,剩下的就是讀取注冊表了,這個應該就非常簡單了吧?


版權聲明:本站所有文章和資源使用CC BY-NC-SA 4.0協議授權發布 , 轉載應當以相同方式注明文章來自“SeaOMC.COM->刪除任務欄鎖定,任務欄圖標的位置,查找可行性文件的方式!在下邊可以分享本文哦!
喜歡 (0)
[]
分享 (0)
奇跡の海
關于作者:
一個WordPress菜鳥!
發表我的評論
取消評論

表情 貼圖 加粗 刪除線 居中 斜體 簽到

Hi,您需要填寫昵稱和郵箱!

  • 昵稱 (必填)
  • 郵箱 (必填)
  • 網址
中国福利彩票36选7开奖结果