|
Вопрос # 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)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|