Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.29;
Скачать: CL | DM;

Вниз

Hook Shell_TrayWnd, Помогите не в службу, а в дружбу.   Найти похожие ветки 

 
Arazel ©   (2005-11-18 17:39) [0]

Здравствуйте дорогие коллегий…

Вот опять с проблемами… ну сами понимайте все знать
не возможно, но самое главное помнить!

Вот решил докончить свой заброшенный Shell – проект
но есть кое, какие проблемы! Если кто знаком помогите
как в дружбу и уважений…

Вот и вопрос:

Осталось сделать Shell_TrayWnd как я понял его надо обрабатывать
в DLL с перехватом сообщений WM_COPYDATA…
Но, к сожалению, я с этим плохо знаком и не в силах сделать
такое да ещё времени нет, но надо сделать!

Если кому не трудно уделите внимание на этот код
который находится ниже…

Сам код надо перевести как DLL, в котором и будет обрабатываться
WM_COPYDATA его надо перехватить.


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, ShellApi, extctrls, ImgList , CommCtrl;

type
  TTrayInfo = record
   TrayIcon: TImage;
   Wnd: HWND;
   uID: UINT;
   uCallBack: UINT;
  end;

 TForm1 = class(TForm)
   Button1: TButton;
   ImageList1: TImageList;
   PsTray: TPanel;
   procedure CreateParams(var Params: TCreateParams); override;
   procedure FormCreate(Sender: TObject);
   procedure TrayProcDblClick(Sender: TObject);
   procedure TrayProcMouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure TrayProcMouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure NewTrayIcon(NID: PNotifyIconData);
   procedure Button1Click(Sender: TObject);
 private
   procedure WMCOPYDATA(var Msg: Tmessage); message WM_COPYDATA;
   //procedure DeleteTrayIcon(NID: PNotifyIconData);
   //procedure ModifyTrayIcon(NID: PNotifyIconData);
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 TrayInfo: array of TTrayInfo;

implementation

{$R *.DFM}

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.WinClassName := "Shell_TrayWnd";
end;

procedure TForm1.FormCreate(Sender: TObject);
var
WM_TASKBARCREATED: UINT;
begin

Form1.Width := Screen.Width ;
Form1.Left := 0;
Form1.top := trunc(Screen.Height/2 - Form1.Height/2 );
psTray.Width := Form1.Width - button1.Width -10;

WM_TASKBARCREATED := RegisterWindowMessage("TaskbarCreated");
PostMessage(HWND_BROADCAST, WM_TASKBARCREATED, 0, 0);
end;

procedure TFORM1.WMCOPYDATA(var Msg: Tmessage);
var
pcd: PCopyDataStruct;
NID: PNotifyIconData;
begin
pcd := PCOPYDATASTRUCT(msg.lParam);
  case pcd^.dwData of
   1:
   begin
    case integer(pointer(integer(pcd.lpData)+4)^) of
       NIM_ADD: begin
                nid := pointer(integer(pcd.lpData)+8);

               Msg.Result := longint(true);
               NewTrayIcon(nid);
                end;
{        NIM_DELETE: begin
                   nid := pointer(integer(pcd.lpData)+8);
               Msg.Result := longint(true);
                   DeleteTrayIcon(nid);
                   end;
       NIM_MODIFY: begin
                   nid := pointer(integer(pcd.lpData)+8);
               Msg.Result := longint(true);
                   ModifyTrayIcon(nid);
                   end;}
    end;
    exit;
   end;
  end;
end;

procedure TFORM1.NewTrayIcon(NID: PNotifyIconData);
var
ind: integer;
BtIcon: TBitmap;
begin

if nid.Wnd=0 then exit;

ind:=Length(TrayInfo);
//SetLength(TrayIcon,ind+1);
SetLength(TrayInfo,ind+1);

TrayInfo[ind].TrayIcon := TImage.Create(Form1);
TrayInfo[ind].TrayIcon.parent := Form1.PsTray;
TrayInfo[ind].TrayIcon.Height := 16;
TrayInfo[ind].TrayIcon.Width := 16;
TrayInfo[ind].TrayIcon.AutoSize := false;
TrayInfo[ind].TrayIcon.Stretch := true;
TrayInfo[ind].TrayIcon.Transparent := true;
TrayInfo[ind].TrayIcon.Visible := true;

 BtIcon := TBitmap.Create;
 ImageList1.BkColor := Form1.Color;
 ImageList_ReplaceIcon(imagelist1.handle,0, nid.hIcon);
 ImageList1.GetBitmap(0, BtIcon);
 TrayInfo[ind].TrayIcon.Picture.Bitmap := BtIcon  ;
 bticon.free;

TrayInfo[ind].TrayIcon.Top := 5;
TrayInfo[ind].TrayIcon.Left := 26+(ind*20);
TrayInfo[ind].TrayIcon.ShowHint := true;
TrayInfo[ind].TrayIcon.Hint := StrPas(nid.szTip);
TrayInfo[ind].TrayIcon.Tag := ind;
TrayInfo[ind].TrayIcon.OnMouseDown := TrayProcMouseDown;
TrayInfo[ind].TrayIcon.OnMouseUp := TrayProcMouseUp;
TrayInfo[ind].TrayIcon.OnDblClick := TrayProcDblClick;

trayInfo[ind].Wnd := nid.Wnd ;
trayInfo[ind].uID := nid.uID ;
trayInfo[ind].uCallBack := nid.uCallbackMessage ;

end;

procedure TForm1.TrayProcDblClick(Sender: TObject);
var
ind: integer;
begin
ind:= (Sender as TImage).tag;

PostMessage(TrayInfo[ind].Wnd, trayInfo[ind].uCallBack,
              trayInfo[ind].uID, WM_LBUTTONDBLCLK);
end;

procedure TForm1.TrayProcMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
var
ind: integer;
begin
ind:= (Sender as TImage).tag;

Case Button of
mbLeft: PostMessage(TrayInfo[ind].Wnd, trayInfo[ind].uCallBack,
                 trayInfo[ind].uID, WM_LBUTTONDOWN);
mbRight: PostMessage(TrayInfo[ind].Wnd, trayInfo[ind].uCallBack,
                 trayInfo[ind].uID, WM_RBUTTONDOWN);
mbMiddle: PostMessage(TrayInfo[ind].Wnd, trayInfo[ind].uCallBack,
                 trayInfo[ind].uID, WM_MBUTTONDOWN);
End;
end;

procedure TForm1.TrayProcMouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
var
ind: integer;
begin
ind:= (Sender as TImage).tag;
Case Button of
mbLeft: PostMessage(TrayInfo[ind].Wnd, trayInfo[ind].uCallBack,
           trayInfo[ind].uID, WM_LBUTTONUP);

mbRight: PostMessage(TrayInfo[ind].Wnd, trayInfo[ind].uCallBack,
           trayInfo[ind].uID, WM_RBUTTONUP);

mbMiddle: PostMessage(TrayInfo[ind].Wnd, trayInfo[ind].uCallBack,
           trayInfo[ind].uID, WM_MBUTTONUP);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShellExecute(Handle,"open",pchar("explorer.exe"),pchar("") ,pchar(""),SW_SHOWNORMAL);

end;

end.


 
Arazel ©   (2005-11-20 08:35) [1]

Что не  кто не знает 8(


 
DVM ©   (2005-11-21 10:05) [2]


> Осталось сделать Shell_TrayWnd как я понял его надо обрабатывать
> в DLL с перехватом сообщений WM_COPYDATA…

Неправильно ты понял. Если класс ТВОЕГО окна будет называться Shell_TrayWnd, то сообщения "иконок трея" сами будут приходить твоему окну без всяких ловушек. Но это только если не запущен эксплорер. Но если твоя программа - это шелл, зачем эксплорер нужен.


 
Idx ©   (2005-11-21 11:48) [3]

DVM ©   (21.11.05 10:05) [2]
Неправильно ты понял. Если класс ТВОЕГО окна будет называться Shell_TrayWnd, то сообщения "иконок трея" сами будут приходить твоему окну без всяких ловушек. Но это только если не запущен эксплорер. Но если твоя программа - это шелл, зачем эксплорер нужен.

Покажи хотя бы как ты перехватываешь это сообщение WM_COPYDATA?



Страницы: 1 вся ветка

Текущий архив: 2006.01.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.048 c
1-1135353216
Zirus
2005-12-23 18:53
2006.01.29
Динамически создаю CheckBox на GroupBox. Как исключить моргание?


6-1124085302
iskatel
2005-08-15 09:55
2006.01.29
Подключение удаленного доступа к сети / отключение


8-1124463831
Артём
2005-08-19 19:03
2006.01.29
Проблема с DBCLICK


6-1127938364
Klim
2005-09-29 00:12
2006.01.29
Проблема создания TServerSocket


15-1136658189
(CHALING 32)S K i N E R
2006-01-07 21:23
2006.01.29
Обновления это хорошо но не всегда!