|
#1
|
||||
|
||||
Замена меню Пуск
Я уверен, что эта тема поднималась, но гугл выдал не так много информации, сколько хотелось бы.
Суть вот в чём. Хочу несколько разнообразить свою игрушку под названием Asus EeePC 700 2G Surf. Вместо меню пуск создать мощную (и лёгкую!) оболочку - быстрый запуск программ, список всех программ, ну, и виджеты понемногу - погода, новости, почта - но это дело десятое... От вас хочу услышать, как можно перехватить ВСЕ методы открытия пуска - с клавиатуры, нажатием на "Пуск" в таскбаре... Взамен - "спасибо", плюс в репутацию и опен-сорс версия конечного результата, с подробным описанием SDK для виджетов-плагинов (чтоб сами могли создать/доточить что-либо при необходимости). Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj Последний раз редактировалось PhoeniX, 08.11.2010 в 05:46. |
#2
|
|||
|
|||
Ну тогда уж подменяй сразу всю оболочку. Будет проще, чем отлавливать все возможные варианты.
Лучше тогда разберись как писать свои виджеты для Vista и 7. Ну и отдельные версии для XP, которая еще очень много где стоит. Или просто свой тул для создания виджетов, который будет работать под XP, Vista и 7. Не надо заменять стандартные элементы. Должен оставаться стандартный метод, с помощью которого можено обойти твою тулзу, если она заглючит. |
#3
|
||||
|
||||
Я хочу сделать примерно так: висит в памяти некая программа-заглушка (ловит события). В момент X она запускает мою программу, которая плавно выезжает из-за края экрана (тут "айфоновский трюк" - выезжает последний скриншот, сделанный перед закрытием, а после загрузки самой программы просто заменяется интерфейс). Если одна из частей зависла - один из процессов убивается через диспетчер задач, и меню возвращается на стандартное.
Цитата:
Цитата:
Так вот мне для XP и надо... Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj Последний раз редактировалось PhoeniX, 08.11.2010 в 05:46. |
#4
|
|||
|
|||
Я ж говорю - лучше сделай простой движок виждетов. Хочешь свою меню - справа, например, есть виджет, который "вылезает" и дает доступ к твоему меню, всему из себя такому красивому и т.д.
|
#5
|
|||
|
|||
Например, вот мне нужен виджет с часами, типа того, как KOOL сделал. Только мне надо так, что бы я мог сам сказать сколько часов надо и какие часовые пояса там нужны (время). (конечно, мне надо всего двое часов. можно типа как в 7ке сделано - очень прикольно и удобно. Только еще бы сделать так, что бы они как виджет болталист на десктопе. Или типа болтаются на десктопе, но можно по какой-нить кнопульке отобразить на переднем плане, а при потере фокуса опять что бы спрятались).
|
#6
|
||||
|
||||
Виджеты, висящие в фоне, мне как раз таки не нужны. Почитай спецуху ноута (название в 1 посте), у него и так железо дохловатое. Мне нужно именно расширить функционал Пуска.
ОФФ: Насчёт часов - чем готовые не устраивают? Их щас хоть "попой ешь" - хоть аналоговые, хоть цифровые, хоть двоичные, на сколько угодно поясов... Их щас клепает каждый третий программер (у каждого - со своими "блекджеком и шлюхами"), так что выбор есть... Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#7
|
||||
|
||||
Так что, по теме (способ отлова вызова Пуска) мне кто-нибудь подскажет?
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#8
|
|||
|
|||
Ну попробуй по классу окна с меню. Наверное, будет самое простое - одно место.
|
#9
|
||||
|
||||
отловить вызов меню по нажатию клавиш Win, Ctrl+Esc решается с помощью SetWindowsHookEx(WH_KEYBOARD_LL, @LowLevelKeyboardProc, HInstance, 0); так же этот вызов можно блокировать. а вот с отловом клика мышкой по кнопке "Пуск" до конца не решил: отловить можно, но отменить не получается. попозже выложу код, что удалось сделать. "причесать" код надо.
Пишу программы за еду. __________________ |
#10
|
||||
|
||||
модуль программы:
Код:
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
|
||||
|
||||
Большое спасибо уже за это. Насчёт нажатия крысой надо бы, но хорошо, что уже это работает.
Кстати, заметил косяк, что при нажатии Win на клавиатуре программе приходит 2 сообщения (видимо, и о нажатии, и о отжатии), а если кнопку зажать - сообщения вообще летят очень быстро и много. В то же время, система обрабатывает только отжатие клавиши. Это я, собственно, поправил. Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#12
|
||||
|
||||
вот ведь, а. добился от своей формы полного поведения меню Пуск, но... как и меню Пуск, форма скрывается с экрана, когда, например, щелкнуть по рабочему столу или другому окну, т.е. на своей форме никуда не ткнуть - также как и Пуск убирается с экрана
http://data.cod.ru/74600 Пишу программы за еду. __________________ Последний раз редактировалось NumLock, 11.11.2010 в 13:20. |