Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1273
Благодарности: 1030

Профиль | Отправить PM | Цитировать


Цитата Aleksoid1978:
Нашел косяк в скрипте Закрепления на панели задач »
Aleksoid1978, в чем именно? Скрипт закрепления ярлыка на панели задач - это порт vbs-сценария, представленного вами (кстати, у вас в примере не используется самое главное - переменная strVerb) и гуляющего в интернете.
Цитата Aleksoid1978:
если в х64 битной системе и файл расположен по пути "C:\Program Files\..." - то значок программы закреплаяется, но если запустить программу - создается еще один значок, уже запущенной задачи на панели задач, если закрепить из пути "C:\Program Files (x86)\..." - то все ок. Разрядность программы при этом не имеет значения. »
Aleksoid1978, это верно. Гугл выдает, что эта проблема у многих программ возникает. Думаю, что система при вызове кода закрепления ярлыка программы из Program Files, system32 (т.е. для директорий, предназначенных для 64-битных файлов) из 32-битной программы, коей является Inno, тихо редиректит 64-битные директории на 32-битные. Да, созданный ярлык ссылается куда надо, но похоже имеет разные AppID с иконкой запущенного того же самого приложения, поэтому система и не может их сгруппировать. Как-то так, я могу и ошибаться, точнее программисты скажут, которые вплотную работают с API таскбара.
Цитата Aleksoid1978:
Все получилось, кроме одного - при наличии на панели уже такого ярлыка - создается ярлык типа MPC-BE(2).lnk; »
Aleksoid1978, кстати да, я не учел наличие ярлыка. Исправление:
читать дальше »

Код: Выделить весь код
const
    LOAD_LIBRARY_AS_DATAFILE = $2;

#define A = (Defined UNICODE) ? "W" : "A"

function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryEx{#A}@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external 'LoadString{#A}@user32.dll stdcall';
function SHGetNewLinkInfo(pszLinkTo, pszDir: String; var pszName: Char; var pfMustCopy: Longint; uFlags: UINT): BOOL; external 'SHGetNewLinkInfo{#A}@shell32.dll stdcall';

/////////////////////////////////////////////////////////////////////////
function PinToTaskbar(const szFilename: String; IsPin: Boolean): Boolean;
//szFilename: full path to executable file
//IsPin: False - unpin to TaskBar, True - pin from TaskBar
var
    hInst: THandle;
    buf: array [0..255] of Char;
    i, res: Integer;
    strLnk, strVerb: String;
    objShell, colVerbs: Variant;
begin
    Result := False;
    if (GetWindowsVersion < $06010000) or not FileExists(szFilename) then Exit;
    if IsPin then
    begin
        if SHGetNewLinkInfo(szFilename, ExpandConstant('{tmp}'), buf[0], res, 0) then
        begin
            while buf[Length(strLnk)] <> #0 do Insert(buf[Length(strLnk)], strLnk, Length(strLnk)+1);
            if FileExists(ExpandConstant('{userappdata}\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\') + ExtractFileName(strLnk)) then Exit;
        end;
        res := 5386;
    end else res := 5387;
    hInst := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
    if hInst <> 0 then
    try
        for i := 0 to LoadString(hInst, res, buf[0], 255)-1 do Insert(buf[i], strVerb, i+1);
        try
            objShell := CreateOleObject('Shell.Application');
            colVerbs := objShell.Namespace(ExtractFileDir(szFilename)).ParseName(ExtractFileName(szFilename)).Verbs;
            for i := 1 to colVerbs.Count do if CompareText(colVerbs.Item[i].Name, strVerb) = 0 then
            begin
                colVerbs.Item[i].DoIt;
                Result := True;
                Break;
            end;
        except
            Exit;
        end;
    finally
        FreeDLL(hInst);
    end;
end;


Цитата Johny777:
не знаю как не допускать ввод в этот самый эдит букв например через в OnKeyPress »
Johny777, напиши в обработчике OnKeyPress:
Код: Выделить весь код
if Pos(Key, '0123456789'#8) = 0 then Key := #0;
P.S. Но копипастой все равно можно будет вставить что угодно.

Последний раз редактировалось El Sanchez, 14-03-2013 в 13:06. Причина: fix

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:13, 14-09-2012 | #926