Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Рабочий стол
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.11.2010, 03:24
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию Замена меню Пуск

Я уверен, что эта тема поднималась, но гугл выдал не так много информации, сколько хотелось бы.

Суть вот в чём. Хочу несколько разнообразить свою игрушку под названием Asus EeePC 700 2G Surf. Вместо меню пуск создать мощную (и лёгкую!) оболочку - быстрый запуск программ, список всех программ, ну, и виджеты понемногу - погода, новости, почта - но это дело десятое...

От вас хочу услышать, как можно перехватить ВСЕ методы открытия пуска - с клавиатуры, нажатием на "Пуск" в таскбаре...

Взамен - "спасибо", плюс в репутацию и опен-сорс версия конечного результата, с подробным описанием SDK для виджетов-плагинов (чтоб сами могли создать/доточить что-либо при необходимости).
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj

Последний раз редактировалось PhoeniX, 08.11.2010 в 05:46.
Ответить с цитированием
  #2  
Старый 08.11.2010, 04:57
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну тогда уж подменяй сразу всю оболочку. Будет проще, чем отлавливать все возможные варианты.

Лучше тогда разберись как писать свои виджеты для Vista и 7.
Ну и отдельные версии для XP, которая еще очень много где стоит.
Или просто свой тул для создания виджетов, который будет работать под XP, Vista и 7. Не надо заменять стандартные элементы. Должен оставаться стандартный метод, с помощью которого можено обойти твою тулзу, если она заглючит.
Ответить с цитированием
  #3  
Старый 08.11.2010, 05:39
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Я хочу сделать примерно так: висит в памяти некая программа-заглушка (ловит события). В момент X она запускает мою программу, которая плавно выезжает из-за края экрана (тут "айфоновский трюк" - выезжает последний скриншот, сделанный перед закрытием, а после загрузки самой программы просто заменяется интерфейс). Если одна из частей зависла - один из процессов убивается через диспетчер задач, и меню возвращается на стандартное.
Цитата:
Сообщение от lmikle
Ну тогда уж подменяй сразу всю оболочку.
Была идея, конечно, полностью переписать explorer.exe, но, мне кажется, не осилю...
Цитата:
Сообщение от lmikle
Лучше тогда разберись как писать свои виджеты для Vista и 7.
Ну и отдельные версии для XP, которая еще очень много где стоит

Так вот мне для XP и надо...
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj

Последний раз редактировалось PhoeniX, 08.11.2010 в 05:46.
Ответить с цитированием
  #4  
Старый 08.11.2010, 05:47
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Я ж говорю - лучше сделай простой движок виждетов. Хочешь свою меню - справа, например, есть виджет, который "вылезает" и дает доступ к твоему меню, всему из себя такому красивому и т.д.
Ответить с цитированием
  #5  
Старый 08.11.2010, 05:51
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Например, вот мне нужен виджет с часами, типа того, как KOOL сделал. Только мне надо так, что бы я мог сам сказать сколько часов надо и какие часовые пояса там нужны (время). (конечно, мне надо всего двое часов. можно типа как в 7ке сделано - очень прикольно и удобно. Только еще бы сделать так, что бы они как виджет болталист на десктопе. Или типа болтаются на десктопе, но можно по какой-нить кнопульке отобразить на переднем плане, а при потере фокуса опять что бы спрятались).
Ответить с цитированием
  #6  
Старый 08.11.2010, 05:58
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Виджеты, висящие в фоне, мне как раз таки не нужны. Почитай спецуху ноута (название в 1 посте), у него и так железо дохловатое. Мне нужно именно расширить функционал Пуска.

ОФФ: Насчёт часов - чем готовые не устраивают? Их щас хоть "попой ешь" - хоть аналоговые, хоть цифровые, хоть двоичные, на сколько угодно поясов... Их щас клепает каждый третий программер (у каждого - со своими "блекджеком и шлюхами"), так что выбор есть...
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #7  
Старый 10.11.2010, 00:38
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Так что, по теме (способ отлова вызова Пуска) мне кто-нибудь подскажет?
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #8  
Старый 10.11.2010, 04:43
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну попробуй по классу окна с меню. Наверное, будет самое простое - одно место.
Ответить с цитированием
  #9  
Старый 10.11.2010, 08:59
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

отловить вызов меню по нажатию клавиш Win, Ctrl+Esc решается с помощью SetWindowsHookEx(WH_KEYBOARD_LL, @LowLevelKeyboardProc, HInstance, 0); так же этот вызов можно блокировать. а вот с отловом клика мышкой по кнопке "Пуск" до конца не решил: отловить можно, но отменить не получается. попозже выложу код, что удалось сделать. "причесать" код надо.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #10  
Старый 10.11.2010, 09:38
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

модуль программы:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure SCTASKLIST(var msg: TMessage); message WM_USER+$1001;
  end;

var
  Form1: TForm1;

procedure SetHook(hWnd: HWND; uMsg: Cardinal); external 'Hook.dll';
procedure UnSetHook(); external 'Hook.dll';

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetHook(Handle, WM_USER+$1001);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnSetHook(); 
end;

procedure TForm1.SCTASKLIST(var msg: TMessage);
begin
  Memo1.Lines.Add('Попытка вызвать меню "Пуск" через '+IntToStr(msg.LParam));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SendMessage(Handle, WM_SYSCOMMAND, SC_TASKLIST, 0);
end;

end.

библиотека:

Код:
library Hook;

uses
  Windows, Messages;

type
  PGlobalData = ^TGlobalData;
  TGlobalData = record
    hWnd: HWND;
    uMsg: Cardinal;
  end;

  PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
  KBDLLHOOKSTRUCT = record
    vkCode: DWORD;
    scanCode: DWORD;
    flags: DWORD;
    time: DWORD;
    dwExtraInfo: Pointer;
  end;

const
  FileMappingName: PChar = 'Shared_Memory_Start_Button';

  WH_KEYBOARD_LL = 13;
  WH_MOUSE_LL = 14;

var
  FileMappingHandle: THandle;
  GlobalData: PGlobalData = nil;

  hLowLevelKeyboardProc: HHOOK = 0;
  
  kEsc: Boolean;
  kCtrl: Boolean;

function LowLevelKeyboardProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  if nCode=HC_ACTION then
  begin
    case wParam of
      WM_KEYDOWN: begin
        if PKBDLLHOOKSTRUCT(lParam)^.vkCode=VK_ESCAPE then kEsc:=True
        else if (PKBDLLHOOKSTRUCT(lParam)^.vkCode=VK_LCONTROL) or (PKBDLLHOOKSTRUCT(lParam)^.vkCode=VK_RCONTROL) then kCtrl:=True;
      end;
      WM_KEYUP: begin
        if PKBDLLHOOKSTRUCT(lParam)^.vkCode=VK_ESCAPE then kEsc:=False
        else if (PKBDLLHOOKSTRUCT(lParam)^.vkCode=VK_LCONTROL) or (PKBDLLHOOKSTRUCT(lParam)^.vkCode=VK_RCONTROL) then kCtrl:=False;
      end;
    end;
    if (kEsc) and (kCtrl) then
    begin
      PostMessage(GlobalData^.hWnd, GlobalData^.uMsg, 0, VK_ESCAPE);
      Result:=1;
      Exit;
    end;
    if (PKBDLLHOOKSTRUCT(lParam)^.vkCode=VK_RWIN) then
    begin
      PostMessage(GlobalData^.hWnd, GlobalData^.uMsg, 0, VK_RWIN);
      Result:=1;
      Exit;
    end;
    if (PKBDLLHOOKSTRUCT(lParam)^.vkCode=VK_LWIN) then
    begin
      PostMessage(GlobalData^.hWnd, GlobalData^.uMsg, 0, VK_LWIN);
      Result:=1;
      Exit;
    end;
  end;
  Result:=CallNextHookEx(0, nCode, wParam, lParam);
end;

procedure SetHook(hWnd: HWND; uMsg: Cardinal);
begin
  kEsc:=False;
  kCtrl:=False;
  GlobalData^.hWnd:=hWnd;
  GlobalData^.uMsg:=uMsg;
  hLowLevelKeyboardProc:=SetWindowsHookEx(WH_KEYBOARD_LL, @LowLevelKeyboardProc, HInstance, 0);
end;

procedure UnSetHook();
begin
  if hLowLevelKeyboardProc<>0 then UnhookWindowsHookEx(hLowLevelKeyboardProc);
end;

exports
  SetHook, UnSetHook;

procedure DLLHandler(Reason: Integer);
begin
  case Reason of
    DLL_PROCESS_ATTACH: begin
      FileMappingHandle:=CreateFileMapping($ffffffff, nil, PAGE_READWRITE, 0, SizeOf(TGlobalData), FileMappingName);
      GlobalData:=MapViewOfFile(FileMappingHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalData));
    end;
    DLL_PROCESS_DETACH: begin
      UnmapViewOfFile(GlobalData);
      CloseHandle(FileMappingHandle);
    end;
  end;
end;

begin
  DllProc:=@DLLHandler;
  DLLHandler(DLL_PROCESS_ATTACH);
end.

http://data.cod.ru/74470
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #11  
Старый 10.11.2010, 19:20
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Большое спасибо уже за это. Насчёт нажатия крысой надо бы, но хорошо, что уже это работает.

Кстати, заметил косяк, что при нажатии Win на клавиатуре программе приходит 2 сообщения (видимо, и о нажатии, и о отжатии), а если кнопку зажать - сообщения вообще летят очень быстро и много. В то же время, система обрабатывает только отжатие клавиши. Это я, собственно, поправил.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #12  
Старый 11.11.2010, 11:35
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

вот ведь, а. добился от своей формы полного поведения меню Пуск, но... как и меню Пуск, форма скрывается с экрана, когда, например, щелкнуть по рабочему столу или другому окну, т.е. на своей форме никуда не ткнуть - также как и Пуск убирается с экрана
http://data.cod.ru/74600
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 11.11.2010 в 13:20.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:44.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter