新云软件园:请安心下载,绿色无病毒!

软件提交最近更新热门排行
您现在的位置:首页››软件教程››应用集锦

Windows7如何把程序锁定到任务栏

2013-10-08 20:34作者:妖哥来源:csdn浏览:1422 评论:70

在CSDN论坛看到有网友提问如何把程序钉到Windows7的任务栏,ccrun(妖哥)对这个问题很感兴趣,于是google了一下,没有找到相关的API资料,但是在国外的一个站点看到用FolderItemVerb对象来实现的方法,关于具体的资料,可以查阅MSDN:

http://msdn.microsoft.com/en-us/ ... 74172(v=vs.85).aspx

在Delphi中实现的代码如下。编译环境:Delphi7和XE2,测试操作系统为中文和英文Windows7

uses ComObj;

procedure CrnPinAppToWin7Taskbar(strPath, strApp: string);
var
  vShell, vFolder, vFolderItem, vItemVerbs: Variant;
  vPath, vApp: Variant;
  i: Integer;
  str: String;
  h: HINST;
  szPinName: array[0..255] of Char;
begin
  vShell := CreateOleObject('Shell.Application');
  vPath := strPath;
  vFolder := vShell.NameSpace(vPath);
  vApp := strApp;
  vFolderItem := vFolder.ParseName(vApp);
  vItemVerbs := vFolderItem.Verbs;

  h := LoadLibrary('Shell32.dll');
  LoadString(h, 5386, szPinName, 256);
  FreeLibrary(h);

  for i := 1 to vItemVerbs.Count do
  begin
    str := vItemVerbs.Item(i).Name;

    if SameText(str, szPinName) then
    begin
      // 63 63 72 75 6E 2E 63 6F 6D
      vItemVerbs.Item(i).DoIt;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  CrnPinAppToWin7Taskbar('C:\windows', 'regedit.exe');
end;

在C++Builder中的实现代码如下。编译环境:C++Builder6和XE2,测试操作系统:中文和英文Windows7

#include <comobj.hpp>

void __fastcall CrnPinAppToWin7Taskbar(String strPath, String strApp)
{
    Variant vShell = CreateOleObject("Shell.Application");
    Variant vFolder = vShell.OleFunction("NameSpace", WideString(strPath));
    Variant vFolderItem = vFolder.OleFunction("ParseName", WideString(strApp));
    Variant vItemVerbs = vFolderItem.OleFunction("Verbs");

    // 获取Pin to Taskbar的Verb字符串, 感谢titilima
    HINSTANCE hInst = ::LoadLibrary("Shell32.dll");

    TCHAR szPinName[256] = { 0 };
    ::LoadString(hInst, 5386, szPinName, 256);

    ::FreeLibrary(hInst);

    String str;

    int nCount = vItemVerbs.OlePropertyGet("Count");
    for (int i = 0; i < nCount; i++)
    {
        str = vItemVerbs.OleFunction("Item", i).OlePropertyGet("Name");

        if (SameText(str, szPinName))
        {
            // 63 63 72 75 6E 2E 63 6F 6D
            vItemVerbs.OleFunction("Item", i).OleFunction("DoIt");
        }
    }
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    CrnPinAppToWin7Taskbar("C:\\windows\", "notepad.exe");
}

另外,感谢titilima大牛,针对.lnk文件钉到Win7任务栏,有更简便的方法:

C++代码:

::ShellExecute(NULL, TEXT("TaskbarPin"), TEXT("E:\\Temp\\Notepad.lnk"), NULL, NULL, SW_SHOW);

Delphi代码:

ShellExecute(nil, 'TaskbarPin', 'E:\Temp\Notepad.lnk'), nil, nil, SW_SHOW);

winapi 锁定程序到任务栏 c++[/url]

#include "stdafx.h"
#include <Windows.h>
#include <shlobj.h>
#include <comdef.h>
#include <atlbase.h>

#define IF_FAILED_OR_NULL_BREAK(rv,ptr) \
    {if (FAILED(rv) || ptr == NULL) break;}

#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }

const WCHAR kPinStrEn[] = L"Pin to Taskbar";
const WCHAR kPinStrCh[] = L"锁定到任务栏";

bool PinToWin7TaskBar(const WCHAR* file_dir,const WCHAR* file_name)
{
    CoInitialize(NULL);
    CComPtr<IShellDispatch> pShellDisp;
    CComPtr<Folder> folder_ptr;
    CComPtr<FolderItem> folder_item_ptr;
    CComPtr<FolderItemVerbs> folder_item_verbs_ptr;
    bool ret = false;
    HRESULT rv = CoCreateInstance( CLSID_Shell, NULL, CLSCTX_SERVER,IID_IDispatch, (LPVOID *) &pShellDisp );
    do 
    {
        IF_FAILED_OR_NULL_BREAK(rv,pShellDisp);
        rv = pShellDisp->NameSpace(_variant_t(file_dir),&folder_ptr);

        IF_FAILED_OR_NULL_BREAK(rv,folder_ptr);
        rv = folder_ptr->ParseName(CComBSTR(file_name),&folder_item_ptr);

        IF_FAILED_OR_NULL_BREAK(rv,folder_item_ptr);
        rv = folder_item_ptr->Verbs(&folder_item_verbs_ptr);

        IF_FAILED_OR_NULL_BREAK(rv,folder_item_verbs_ptr);
        long count = 0;
        folder_item_verbs_ptr->get_Count(&count);
        for (long i = 0; i < count ; ++i)
        {
            FolderItemVerb* item_verb = NULL;
            rv = folder_item_verbs_ptr->Item(_variant_t(i),&item_verb);
            if (SUCCEEDED(rv) && item_verb)
            {
                CComBSTR name;
                item_verb->get_Name(&name);
                if (_wcsnicmp(name,kPinStrEn,wcslen(kPinStrEn)) == 0
                    || _wcsnicmp(name,kPinStrCh,wcslen(kPinStrCh)) == 0)
                {
                    item_verb->DoIt();
                    ret = true;
                    break;
                }
            }
        }
    } while (0);

    CoUninitialize();
    return ret;
}

int main(int _args,char* _argc)
{
    PinToWin7TaskBar(L"C:\\Users\\Administrator\\AppData\\Roaming\\yyExplore\\yyExplore",
        L"yyExplore.exe");
    return 0;
}
顶一下(33)
94.29%
    1. 免费跨国聊天免费跨国聊天

      新云软件园小编在这里给大家整理了免费跨国聊天app软件。可以与不同国家的好友一起跨国交流,有着在线翻译神器,海量高颜值用户的跨国聊天交友平台,软件最大的特色就是带有开启摄像头的随机匹配模式,我们不仅可以在软...

    文章评论

    请自觉遵守互联网相关政策法规,评论内容只代表网友观点,与本站立场无关!
      验证码:     登录   注册
    网友评论