2009-10-27 38 views
7

Tôi đang sử dụng trình cài đặt Inno Setup tuyệt vời và tôi nhận thấy rằng một số Ứng dụng (thường từ Microsoft) được cài đặt với biểu tượng khởi chạy của chúng đã được hiển thị rõ ràng (được ghim? ') Trong menu bắt đầu (trong Windows 7). Tôi hoàn toàn phụ thuộc vào thuật toán được sử dụng gần đây nhất cho biểu tượng của tôi để được 'lớn' trong trình đơn bắt đầu, hoặc là có một cách để thúc đẩy ứng dụng của tôi từ trình cài đặt xin vui lòng?Có thể 'Ghim vào menu bắt đầu' khi sử dụng Cài đặt Inno không?

Trả lời

6

Có một lý do có no programmatic way ghim điều cần taskbar/start menu. Theo kinh nghiệm của tôi, tôi đã thấy menu bắt đầu highlight newly-created shortcuts và được thiết kế để xử lý chính xác tình huống này. Khi bạn thấy một chương trình mới được cài đặt hiển thị trên menu bắt đầu, có thể là do thuật toán đó chứ không phải vì trình cài đặt đã đặt nó ở đó.

Điều đó nói rằng, nếu phím tắt mới không xuất hiện được đánh dấu, có thể là do trình cài đặt trích xuất lối tắt sẵn có và giữ lại dấu thời gian cũ trên đó thay vì sử dụng hàm API để tạo lối tắt menu bắt đầu.

6

Có thể ghim chương trình, nhưng không chính thức. Dựa trên một mã posted in this thread (trong đó sử dụng cùng một cách như mô tả trong bài viết được liên kết bởi @ Mark Redman) tôi đã viết như sau:

[Code] 
#ifdef UNICODE 
    #define AW "W" 
#else 
    #define AW "A" 
#endif 

const 
    // these constants are not defined in Windows 
    SHELL32_STRING_ID_PIN_TO_TASKBAR = 5386; 
    SHELL32_STRING_ID_PIN_TO_STARTMENU = 5381; 
    SHELL32_STRING_ID_UNPIN_FROM_TASKBAR = 5387; 
    SHELL32_STRING_ID_UNPIN_FROM_STARTMENU = 5382; 

type 
    HINSTANCE = THandle; 
    HMODULE = HINSTANCE; 

    TPinDest = (
    pdTaskbar, 
    pdStartMenu 
); 

function LoadLibrary(lpFileName: string): HMODULE; 
    external 'LoadLibrary{#AW}@kernel32.dll stdcall'; 
function FreeLibrary(hModule: HMODULE): BOOL; 
    external '[email protected] stdcall'; 
function LoadString(hInstance: HINSTANCE; uID: UINT; 
    lpBuffer: string; nBufferMax: Integer): Integer; 
    external 'LoadString{#AW}@user32.dll stdcall'; 

function TryGetVerbName(ID: UINT; out VerbName: string): Boolean; 
var 
    Buffer: string; 
    BufLen: Integer; 
    Handle: HMODULE; 
begin 
    Result := False; 

    Handle := LoadLibrary(ExpandConstant('{sys}\Shell32.dll')); 
    if Handle <> 0 then 
    try 
    SetLength(Buffer, 255); 
    BufLen := LoadString(Handle, ID, Buffer, Length(Buffer)); 

    if BufLen <> 0 then 
    begin 
     Result := True; 
     VerbName := Copy(Buffer, 1, BufLen); 
    end; 
    finally 
    FreeLibrary(Handle); 
    end; 
end; 

function ExecVerb(const FileName, VerbName: string): Boolean; 
var 
    I: Integer; 
    Shell: Variant; 
    Folder: Variant; 
    FolderItem: Variant; 
begin 
    Result := False; 

    Shell := CreateOleObject('Shell.Application'); 
    Folder := Shell.NameSpace(ExtractFilePath(FileName)); 
    FolderItem := Folder.ParseName(ExtractFileName(FileName)); 

    for I := 1 to FolderItem.Verbs.Count do 
    begin 
    if FolderItem.Verbs.Item(I).Name = VerbName then 
    begin 
     FolderItem.Verbs.Item(I).DoIt; 
     Result := True; 
     Exit; 
    end; 
    end; 
end; 

function PinAppTo(const FileName: string; PinDest: TPinDest): Boolean; 
var 
    ResStrID: UINT; 
    VerbName: string; 
begin 
    case PinDest of 
    pdTaskbar: ResStrID := SHELL32_STRING_ID_PIN_TO_TASKBAR; 
    pdStartMenu: ResStrID := SHELL32_STRING_ID_PIN_TO_STARTMENU; 
    end; 
    Result := TryGetVerbName(ResStrID, VerbName) and ExecVerb(FileName, VerbName); 
end; 

function UnpinAppFrom(const FileName: string; PinDest: TPinDest): Boolean; 
var 
    ResStrID: UINT; 
    VerbName: string; 
begin 
    case PinDest of 
    pdTaskbar: ResStrID := SHELL32_STRING_ID_UNPIN_FROM_TASKBAR; 
    pdStartMenu: ResStrID := SHELL32_STRING_ID_UNPIN_FROM_STARTMENU; 
    end; 
    Result := TryGetVerbName(ResStrID, VerbName) and ExecVerb(FileName, VerbName); 
end; 

Đoạn mã trên đầu đọc chú thích của menu item cho ghim hoặc bỏ các ứng dụng khỏi bảng chuỗi của thư viện Shell32.dll. Sau đó kết nối với Windows Shell và cho ứng dụng đích. đường dẫn tạo đối tượng Folder, sau đó lấy đối tượng FolderItem và trên đối tượng này lặp lại tất cả các động từ và kiểm tra có sẵn nếu tên của chúng khớp với tên được đọc từ bảng chuỗi thư viện Shell32.dll. Nếu vậy, nó sẽ gọi hành động mục động từ bằng cách gọi phương thức DoIt và thoát khỏi sự lặp lại.

Đây là một cách sử dụng có thể có của các mã trên, cho ghim:

if PinAppTo(ExpandConstant('{sys}\calc.exe'), pdTaskbar) then 
    MsgBox('Calc has been pinned to the taskbar.', mbInformation, MB_OK); 
if PinAppTo(ExpandConstant('{sys}\calc.exe'), pdStartMenu) then 
    MsgBox('Calc has been pinned to the start menu.', mbInformation, MB_OK); 

Và đối với bỏ khóa:

if UnpinAppFrom(ExpandConstant('{sys}\calc.exe'), pdTaskbar) then 
    MsgBox('Calc is not pinned to the taskbar anymore.', mbInformation, MB_OK); 
if UnpinAppFrom(ExpandConstant('{sys}\calc.exe'), pdStartMenu) then 
    MsgBox('Calc is not pinned to the start menu anymore.', mbInformation, MB_OK); 

Xin lưu ý rằng mặc dù mã này hoạt động trên Windows 7 (và ghim trên thanh tác vụ cũng trên Windows 8.1, nơi tôi đã thử nghiệm nó), nó thực sự là cách hacky, vì không có cách chính thức để lập trình pin chương trình để thanh tác vụ, cũng không bắt đầu trình đơn. Đó là những gì người dùng nên làm theo lựa chọn của riêng họ.

+1

OMG, bạn đã cố gắng tìm ra được bao nhiêu giờ? Cảm ơn bạn rất nhiều! – tmighty

+0

@tmighty, tôi rất vui vì nó đã giúp một ai đó! Và nó đã cho tôi ít hơn giờ; nó chỉ là một mã được tái cấu trúc từ chuỗi được liên kết :-) – TLama

+0

Cảm ơn bạn! :-) Bạn có thể cho tôi biết cách ưa thích của bạn để thực thi mã của bạn không? Tôi có nghĩa là "nếu PinAppTo (ExpandConstant ('{sys} \ calc.exe'), pdTaskbar) thì ...". Bạn làm điều đó ở đâu? Bạn có định nghĩa nó là một nhiệm vụ hay bạn tự động thực thi mã này? Tôi không bao giờ chạy một mã trước khi ngoại trừ cài đặt các runtimes vcredist_x86 mà tôi chạy bằng cách sử dụng [Chạy] "Tên tệp:" {tmp} \ vcredist_x86.exe "; Tham số:"/q "; Kiểm tra: VCRedistNeedsInstall. Đây chỉ là một exe mà tôi phải chạy, không phải là chức năng giống như của bạn – tmighty

Các vấn đề liên quan