Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 745

/ вопрос решён /

Здравствуйте, господа эксперты! У меня такой вопрос: с помощью каких API функций можно управлять кнопкой "Пуск", и какие её (кнопки) преобразования вообще возможны?

alone Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: 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

alone (статус: Посетитель), 18 июля 2007, 01:07 [#2]:

А в какой строке меняется название? У меня не поменялось...
Нахушев Азамат Владимирович

Нахушев Азамат Владимирович (статус: 1-ый класс), 18 июля 2007, 08:28 [#3]:

Заголовок на самом деле не меняется. Берется своя картинка (NewImage.LoadFromFile(\'C:\Windows\delphi.BMP\'-можно соответственно другую свою картинку) и натягивается на место ПУСК
alone

alone (статус: Посетитель), 19 июля 2007, 00:08 [#4]:

Кстати о картинке... Меняется ли она в XP? У меня не получилось поменять картинку ПУСКа

31 января 2011, 19:29: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 12:01
Выполнено за 0.02 сек.