Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.039 c
2-1137003582
mozgan
2006-01-11 21:19
2006.01.29
Аттрибуты файла


15-1136287530
McSimm_
2006-01-03 14:25
2006.01.29
Не желаете ли задачку?


2-1137018122
Farpik
2006-01-12 01:22
2006.01.29
CreateProcess


2-1136903460
@gent
2006-01-10 17:31
2006.01.29
Форма одна или много ?


15-1136196638
PARUS
2006-01-02 13:10
2006.01.29
УДАЛЕНИЕ ПРОГРАММ





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский