| 
| 
 | Вопрос # 745/ вопрос решён / | 
 |  Здравствуйте, господа эксперты! У меня такой вопрос: с помощью каких API функций можно управлять кнопкой "Пуск", и какие её (кнопки) преобразования вообще возможны? 
|  |   Вопрос задал: alone (статус: Посетитель)Вопрос отправлен: 17 июля 2007, 00:10
 Состояние вопроса: решён, ответов: 2.
 |  Ответ #1. Отвечает эксперт: Николай Рубан Здравствуйте, Гадлевский Олег Вячеславович!
 Вот одни из классических издевательств над кнопкой "Пуск":
 1) SendMessage(Handle,WM_SYSCOMMAND,SC_TASKLIST,0); //нажать на кнопку "Пуск"
 
 2) var h:HWND;
 begin
 h:=FindWindowEx(FindWindow(\'Shell_TrayWnd\',nil),0,\'Button\',nil);
 ShowWindow(h, SW_HIDE); //скрываем кнопку "Пуск"
 {ShowWindow(h, SW_SHOWNORMAL); //восстановление видимость}
 end;
 
 3) Предыдущий фокус можно сделать и по другому:
 var h:HWND;
 rgn:HRGN;
 begin
 h:=FindWindowEx(FindWindow(\'Shell_TrayWnd\',nil),0,\'Button\',nil);
 rgn:=CreateRectRgn(0,0,0,0);
 SetWindowRgn(h,rgn,true); //скрываем кнопку "Пуск"
 {  SetWindowRgn(h,0,true); //восстановление видимости }
 end;
 
 4) var h:HWND;
 begin
 h:=FindWindowEx(FindWindow(\'Shell_TrayWnd\',nil),0,\'Button\',nil);
 EnableWindow(h, false); //делаем кнопку недоступной
 {  EnableWindow(h, true); //возвращаем доступность кнопке}
 end;
 
 Вот пожалуй одни из основных фокусов.. - конечно возможно кто-то еще что-то вспомнит ;)
 
 Good Luck!!!
 
|  | Ответ отправил: Николай Рубан (статус: 10-ый класс)Время отправки: 17 июля 2007, 02:39
 Оценка за ответ: 5
 Комментарий к оценке: Спасибо! ))  |  Ответ #2. Отвечает эксперт: Нахушев Азамат Владимирович Здравствуйте, Гадлевский Олег Вячеславович!1. Создать папку в меню ПУСК:
 Uses
 ShlObj, ActiveX;
 
 procedure FreePidl(pidl: PItemIDList);
 var
 allocator: IMalloc;
 begin
 if Succeeded(SHGetMalloc(allocator)) then
 begin
 allocator.Free(pidl);
 {$IFDEF VER100}
 allocator.Release;
 {$ENDIF}
 end;
 end;
 
 function CreateFolder(aFolderName: string; aLocation: Integer): Boolean;
 var
 pIdl: PItemIDList;
 hPath: PChar;
 begin
 Result := False;
 if SUCCEEDED(SHGetSpecialFolderLocation(0, aLocation, pidl)) then
 begin
 hPath := StrAlloc(MAX_PATH);
 SHGetPathFromIDList(pIdl, hPath);
 SetLastError(0);
 CreateDirectory(PChar(hPath + \'\\\' + aFolderName), nil);
 if (GetLastError = 0) or (GetLastError = ERROR_ALREADY_EXISTS) then
 Result := True;
 FreePIDL(pIdl);
 StrDispose(hPath);
 end;
 end;
 
 
 procedure TForm1.Button1Click(Sender: TObject);
 begin
 CreateFolder(\'MyProgramgroup\', CSIDL_PROGRAMS);
 end;
 2. Сделать кнопку ПУСК неактивной:
 Для этого пишем:
 
 
 
 procedure TForm1.Button3Click(Sender: TObject);
 begin
 EnableWindow(FindWindowEx(FindWindow(\'Shell_TrayWnd\', nil),
 0, \'Button\', nil), false);
 end;
 
 Ну, а восстанавливаем активность кнопки такой процедурой:
 
 procedure TForm1.Button4Click(Sender: TObject);
 begin
 EnableWindow(FindWindowEx(FindWindow(\'Shell_TrayWnd\', nil),
 0, \'Button\', nil), true);
 end;
 3. Открыть меню кнопки ПУСК:
 procedure TForm1.Button1Click(Sender: TObject);
 begin
 SendMessage(Self.Handle, WM_SYSCOMMAND, SC_TASKLIST, 0);
 end;
 4. Изменить заголовок кнопки ПУСК:
 Далее займёмся проектом. Сначала объявляем глобальные переменные
 StartButton: hWnd;
 OldBitmap: THandle;
 NewImage: TPicture;
 
 Затем описываем событие по создания окна [OnCreate]:
 
 procedure TForm1.FormCreate(Sender: TObject);
 begin
 NewImage := TPicture.create;
 NewImage.LoadFromFile(\'C:\Windows\delphi.BMP\'); //здесь укажите путь к нужному файлу
 StartButton := FindWindowEx(FindWindow(\'Shell_TrayWnd\', nil), 0, \'Button\', nil);
 OldBitmap := SendMessage(StartButton, BM_SetImage, 0, NewImage.Bitmap.Handle);
 end;
 
 Если вы делаете это на своей машине, то можете всё восстанавливать по событию OnDestroy:
 
 procedure TForm1.FormDestroy(Sender: TObject);
 begin
 SendMessage(StartButton, BM_SetImage, 0, OldBitmap);
 NewImage.Free;
 end;
 5.Изменить размер кнопки ПУСК:
 procedure TForm1.Button1Click(Sender: TObject);
 begin
 MoveWindow(FindWindowEx(FindWindow(\'Shell_TrayWnd\', nil), 0, \'Button\', nil),
 300, 0, 80, 22, true);
 end;
 
|  | Ответ отправил: Нахушев Азамат Владимирович (статус: 1-ый класс)Время отправки: 17 июля 2007, 08:29
 Оценка за ответ: 5
 Комментарий к оценке: Здорово! Как раз то, что я и хотел, спасибо! |  
 Мини-форум вопросаВсего сообщений: 4; последнее сообщение — 19 июля 2007, 00:08; участников в обсуждении: 3. 
|   | Николай Рубан (статус: 10-ый класс), 17 июля 2007, 02:45 [#1]:Да чуть не забыл... В модуле необходимо прописать: uses ShellApi;
 !!!
 |  
|   | alone (статус: Посетитель), 18 июля 2007, 01:07 [#2]:А в какой строке меняется название? У меня не поменялось... |  
|   | Нахушев Азамат Владимирович (статус: 1-ый класс), 18 июля 2007, 08:28 [#3]:Заголовок на самом деле не меняется. Берется своя картинка (NewImage.LoadFromFile(\'C:\Windows\delphi.BMP\'-можно соответственно другую свою картинку) и натягивается на место ПУСК |  
|   | alone (статус: Посетитель), 19 июля 2007, 00:08 [#4]:Кстати о картинке... Меняется ли она в XP? У меня не получилось поменять картинку ПУСКа |  31 января 2011, 19:29: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |