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
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.
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ọ.
OMG, bạn đã cố gắng tìm ra được bao nhiêu giờ? Cảm ơn bạn rất nhiều! – tmighty
@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
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
- 1. Cài đặt Inno Setup có thể chạy được (cài đặt trình điều khiển) trong khi cài đặt
- 2. Làm cách nào tôi có thể sử dụng GetVolumeInformation trong Cài đặt Inno?
- 3. Cài đặt Inno: TBitmapImage không hiển thị
- 4. Chạy trình cài đặt khác trong cài đặt Inno Setup
- 5. httpd không bắt đầu sau khi cài đặt chứng
- 6. Cài đặt Inno: Ẩn/Tắt thành phần khi chạy
- 7. Cài đặt Inno: Cài đặt các dịch vụ Windows bằng cách sử dụng "sc create"
- 8. Có thể gọi một tập tin batch trong khi biên soạn một kịch bản cài đặt Inno không?
- 9. Cài đặt Inno: Cài đặt tệp từ Internet
- 10. Hiển thị liên kết Thỏa thuận Cấp phép trong Cài đặt Inno trong khi cài đặt
- 11. Trong cài đặt Inno, bạn có thể thêm câu lệnh có điều kiện vào phần [Chạy] được thực thi không?
- 12. Bắt chước đầu vào loại mật khẩu khi sử dụng div có thể chỉnh sửa được
- 13. Thoát khỏi Cài đặt Cài đặt Inno từ [code]
- 14. Cài đặt Inno Đổi tên tệp trong khi đóng gói
- 15. Khi nào tôi có thể bắt đầu sử dụng các thuộc tính được đặt bằng UIAppearance?
- 16. Cách ghi đường dẫn cài đặt vào sổ đăng ký sau khi cài đặt hoàn tất với thiết lập Inno
- 17. Firmata với Arduino Mega 1280, không thể đọc tất cả các ghim đầu vào
- 18. Cài đặt Inno - làm cách nào để chương trình của tôi chạy khi người dùng đăng nhập vào Windows?
- 19. Gặp sự cố khi cài đặt mod_WSGI - không thể tìm thấy tệp đầu vào
- 20. Ghi đè hoặc tắt menu cài đặt
- 21. Không thể gọi 'bắt đầu' không xác định khi bắt đầu lịch sử backbone.js.
- 22. Thêm mục nhập ứng dụng cụ thể vào Menu Cài đặt Android
- 23. Cài đặt Inno - Kiểm tra xem tệp có tồn tại ở đích hay không nếu không hủy cài đặt
- 24. Thiết lập Inno: Làm cách nào để xem đầu ra (bản dịch) của Bộ xử lý cài đặt Inno?
- 25. Không thể cài đặt ứng dụng vào emulator 2.3.3: INSTALL_FAILED_DEXOPT
- 26. Làm cách nào để tạo menu trong menu bắt đầu cho chương trình của tôi?
- 27. Cài đặt tệp trong thư mục người dùng AppData bằng cách sử dụng thiết lập inno
- 28. Cài đặt Inno: Thêm trường nhập tùy chỉnh
- 29. Có cách nào để đặt ghim vào ứng dụng iphone bản đồ google bằng cách sử dụng openURL không?
- 30. Đại lý SSH không còn bắt đầu sau khi cài đặt Cygwin
và như được lưu ý trong bài viết đó, có một lý do khiến không có API để ghim trực tiếp. Xin vui lòng không spam máy tính để bàn/taskbar/startmenu/etc. –