PDA

View Full Version : ToolBar و ارسال پیام فشرده شدن دکمه ...



Hamid_PaK
جمعه 04 اسفند 1385, 07:15 صبح
هر کاری کردم نشد که به یکی از دکمه های Toolbar یه برنامه از طریق SendMessage پیغام کلیک کردن رو ارسال کنم ...
کسی از دوستان اطلاعاتی در این باره داره ؟؟؟



type
TTBButton = packed record
iBitmap: Integer;
idCommand: Integer;
fsState: Byte;
fsStyle: Byte;
bReserved: array[1..2] of Byte;
dwData: Longint;
iString: Integer;
end;

TTBButtonInfo = packed record
cbSize: UINT;
dwMask: DWORD;
idCommand: Integer;
iImage: Integer;
fsState: Byte;
fsStyle: Byte;
cx: Word;
lParam: DWORD;
pszText: PChar;
cchText: Integer;
end;

TTBNotify = packed record
hdr: TNMHdr;
iItem: Integer;
tbButton: TTBButton;
cchText: Integer;
pszText: PChar;
end;

const
TBN_FIRST = 0-700; { toolbar }
TBN_LAST = 0-720;

TBCDRF_NOEDGES = $00010000; // Don't draw button edges
TBCDRF_HILITEHOTTRACK = $00020000; // Use color of the button bk when hottracked
TBCDRF_NOOFFSET = $00040000; // Don't offset button if pressed
TBCDRF_NOMARK = $00080000; // Don't draw default highlight of image/text for TBSTATE_MARKED
TBCDRF_NOETCHEDEFFECT = $00100000; // Don't draw etched effect for disabled items

TB_ENABLEBUTTON = WM_USER + 1;
TB_CHECKBUTTON = WM_USER + 2;
TB_PRESSBUTTON = WM_USER + 3;
TB_HIDEBUTTON = WM_USER + 4;
TB_INDETERMINATE = WM_USER + 5;
TB_MARKBUTTON = WM_USER + 6;
TB_ISBUTTONENABLED = WM_USER + 9;
TB_ISBUTTONCHECKED = WM_USER + 10;
TB_ISBUTTONPRESSED = WM_USER + 11;
TB_ISBUTTONHIDDEN = WM_USER + 12;
TB_ISBUTTONINDETERMINATE = WM_USER + 13;
TB_ISBUTTONHIGHLIGHTED = WM_USER + 14;
TB_SETSTATE = WM_USER + 17;
TB_GETSTATE = WM_USER + 18;
TB_ADDBITMAP = WM_USER + 19;
TB_ADDBUTTONSA = WM_USER + 20;
TB_ADDBUTTONSW = WM_USER + 68;
TB_INSERTBUTTONA = WM_USER + 21;
TB_INSERTBUTTONW = WM_USER + 67;
TB_DELETEBUTTON = WM_USER + 22;
TB_GETBUTTON = WM_USER + 23;
TB_BUTTONCOUNT = WM_USER + 24;
TB_COMMANDTOINDEX = WM_USER + 25;

TB_SAVERESTOREA = WM_USER + 26;
TB_ADDSTRINGA = WM_USER + 28;
TB_GETBUTTONTEXTA = WM_USER + 45;
TBN_GETBUTTONINFOA = TBN_FIRST-0;

TB_GETBUTTONINFOW = WM_USER + 63;
TB_SETBUTTONINFOW = WM_USER + 64;
TB_GETBUTTONINFOA = WM_USER + 65;
TB_SETBUTTONINFOA = WM_USER + 66;
TB_GETBUTTONINFO = TB_GETBUTTONINFOA;
TB_SETBUTTONINFO = TB_SETBUTTONINFOA;

TB_SAVERESTOREW = WM_USER + 76;
TB_ADDSTRINGW = WM_USER + 77;
TB_GETBUTTONTEXTW = WM_USER + 75;
TBN_GETBUTTONINFOW = TBN_FIRST-20;
TB_SAVERESTORE = TB_SAVERESTOREA;
TB_ADDSTRING = TB_ADDSTRINGA;
TB_GETBUTTONTEXT = TB_GETBUTTONTEXTA;
TBN_GETBUTTONINFO = TBN_GETBUTTONINFOA;

TBN_DROPDOWN = TBN_FIRST-10;
TBN_CLOSEUP = TBN_FIRST-11;

TB_CUSTOMIZE = WM_USER + 27;
TB_GETITEMRECT = WM_USER + 29;
TB_BUTTONSTRUCTSIZE = WM_USER + 30;
TB_SETBUTTONSIZE = WM_USER + 31;
TB_SETBITMAPSIZE = WM_USER + 32;
TB_AUTOSIZE = WM_USER + 33;
TB_GETTOOLTIPS = WM_USER + 35;
TB_SETTOOLTIPS = WM_USER + 36;
TB_SETPARENT = WM_USER + 37;
TB_SETROWS = WM_USER + 39;
TB_GETROWS = WM_USER + 40;
TB_SETCMDID = WM_USER + 42;
TB_CHANGEBITMAP = WM_USER + 43;
TB_GETBITMAP = WM_USER + 44;
TB_REPLACEBITMAP = WM_USER + 46;
TB_SETINDENT = WM_USER + 47;
TB_SETIMAGELIST = WM_USER + 48;
TB_GETIMAGELIST = WM_USER + 49;
TB_LOADIMAGES = WM_USER + 50;
TB_GETRECT = WM_USER + 51; { wParam is the Cmd instead of index }
TB_SETHOTIMAGELIST = WM_USER + 52;
TB_GETHOTIMAGELIST = WM_USER + 53;
TB_SETDISABLEDIMAGELIST = WM_USER + 54;
TB_GETDISABLEDIMAGELIST = WM_USER + 55;
TB_SETSTYLE = WM_USER + 56;
TB_GETSTYLE = WM_USER + 57;
TB_GETBUTTONSIZE = WM_USER + 58;
TB_SETBUTTONWIDTH = WM_USER + 59;
TB_SETMAXTEXTROWS = WM_USER + 60;
TB_GETTEXTROWS = WM_USER + 61;

TB_GETOBJECT = WM_USER + 62; // wParam == IID, lParam void **ppv
TB_GETHOTITEM = WM_USER + 71;
TB_SETHOTITEM = WM_USER + 72; // wParam == iHotItem
TB_SETANCHORHIGHLIGHT = WM_USER + 73; // wParam == TRUE/FALSE
TB_GETANCHORHIGHLIGHT = WM_USER + 74;
TB_MAPACCELERATORA = WM_USER + 78; // wParam == ch, lParam int * pidBtn

TB_SETEXTENDEDSTYLE = WM_USER + 84; // For TBSTYLE_EX_*
TB_GETEXTENDEDSTYLE = WM_USER + 85; // For TBSTYLE_EX_*
TB_INSERTBUTTON = TB_INSERTBUTTONA;
TB_ADDBUTTONS = TB_ADDBUTTONSA;

{ WM_NOTIFY codes }
NM_FIRST = 0- 0; { generic to all controls }
NM_LAST = 0- 99;
NM_OUTOFMEMORY = NM_FIRST-1;
NM_CLICK = NM_FIRST-2;
NM_DBLCLK = NM_FIRST-3;
NM_RETURN = NM_FIRST-4;
NM_RCLICK = NM_FIRST-5;
NM_RDBLCLK = NM_FIRST-6;
NM_SETFOCUS = NM_FIRST-7;
NM_KILLFOCUS = NM_FIRST-8;
NM_CUSTOMDRAW = NM_FIRST-12;
NM_HOVER = NM_FIRST-13;
NM_NCHITTEST = NM_FIRST-14; // uses NMMOUSE struct
NM_KEYDOWN = NM_FIRST-15; // uses NMKEY struct
NM_RELEASEDCAPTURE = NM_FIRST-16;
NM_SETCURSOR = NM_FIRST-17; // uses NMMOUSE struct
NM_CHAR = NM_FIRST-18; // uses NMCHAR struct

var
Notify: TTBNotify;
begin
Notify.hdr.code := NM_CLICK;
Notify.iItem := 100;
SendMessage(hwndToolbar, WM_NOTIFY, 0, MakeLong(Integer(@Notify), 0));
end;


یا حق ...

Sohrab_Tapar
جمعه 04 اسفند 1385, 12:28 عصر
یک button و بک treeview روی فرم قرار دهید
کد زیر کیست تمام window های موجود (از جمله دکمه مورد نظر شما را)در treeview لیست میکند
با این کد ،نام و نام کلاس مربوط به دکمه مورد نظر را پیدا کنید


function GetWinInfo(Handle : HWND) : String;
var tmp : PChar;
X : String;
buf : Array[0..255] of Char;
begin
//Get ClassName, and Window Caption
//Allow upto 255 Characters
GetMem(tmp,255);
GetClassName(Handle,tmp,255);
X := '['+tmp+'] ';
tmp[0]:=#0;
// GetWindowText(Handle,tmp,255);
// X := X+'['+tmp+']';
// FreeMem(tmp);

SendMessage(Handle, WM_GETTEXT, 255, Integer(@Buf));
X := X + '----['+Buf+']';
//Get the HWND value in hex and Decimal
// X := X+'['+inttohex(Handle,8)+'] ['+inttostr(Handle)+'] ';
Result := X;
end;

procedure GetWinChildren(Handle : HWND;Node : TTreeNode;Tree : TTreeview);
var Childhw : HWND;
ChildNode : TTreeNode;
begin
//Get any Children
ChildHw:=GetWindow(Handle,GW_CHILD);
While Childhw>32 Do Begin
//Add this Handle
ChildNode := Tree.Items.AddChild(Node,GetWinInfo(Childhw));
//Get any Children - Recursive call...
GetWinChildren(Childhw,ChildNode,Tree);
//Get the next window
Childhw := GetWindow(Childhw,GW_HWNDNEXT);
End;
end;

function SaveWinInfo(Handle: THandle; Tree : TTreeView):Boolean; stdcall;
var
Node : TTreeNode;
begin
Node := Tree.Items.Add(nil,Tools.GetWinInfo(Handle));
GetWinChildren(Handle,Node,Tree);
Result := True;
end;

procedure GetWinTree(Tree:TTreeview);
begin
EnumWindows(@SaveWinInfo,LParam(Tree));
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
TreeView1.Items.Clear;
TreeView1.Items.BeginUpdate;
GetWinTree(TreeView1);
TreeView1.Items.EndUpdate;
end;


حال با داشتن نام دکمه و نام کلاس آن میتوانید با کد ساده شده زیر دکمه مورد نظر را انتخاب کرده پیام موردنظرتان را به آن ارسال کنید.تنها کافی است به THE_BUTTON_NAME و THE_BUTTON_CLASS_NAME مقدار دهی نمایید


function GetWinChildren(Handle : HWND;ButName : String):Boolean;
var
Childhw : HWND;
tmp : PChar;
begin
Result := True;
ChildHw:=GetWindow(Handle,GW_CHILD);
While Childhw>32 Do Begin
GetMem(tmp,255);
GetClassName(Childhw,tmp,255);
tmp := StrLower(tmp);
If (GetWinInfo(Childhw) = ButName)AND(tmp = 'THE_BUTTON_CLASS_NAME') Then Begin
SendMessage(Childhw,WM_CLOSE,0,0);
Result := False;
tmp[0]:=#0;
Exit;
End;
GetWinChildren(Childhw,FileName);
Childhw := GetWindow(Childhw,GW_HWNDNEXT);
tmp[0]:=#0;
End;
end;

function SaveWinInfo(Handle: THandle; ButName: String):Boolean; stdcall;
begin
If GetWinInfo(Handle) = ButName Then Begin
SendMessage(Handle,WM_CLOSE,0,0);
Result := False;
Exit;
End;
If NOT GetWinChildren(Handle,ButName) Then Begin
Result := False;
Exit;
End;
Result := True;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
EnumWindows(@SaveWinInfo,LParam(LowerCase('THE_BUT TON_NAME')));
end;

Hamid_PaK
شنبه 05 اسفند 1385, 16:16 عصر
اگر امکان داره بفرمایید کدام قسمت کدی که نوشته اید به Toolbar مربوط می شود ؟؟؟

دکمه ی Toolbar از طریق Child قابل دسترسی نیست !!!

Sohrab_Tapar
شنبه 05 اسفند 1385, 19:38 عصر
شما باید توسط کد اول ،toolbar و سپس دکمه اون رو پیدا کنید
برای این نرم افزار مورد نظر رادر treeview پیدا کنید و سپس در نودهای زیر شاخه آن به دنبال دکمه مورد نظر بگردید،به هر حال این دکمه یک caption داره دیگه میتونین دنبال اون بگردید
بعد که نام ونام کلاس مربوط به دکمه رو پیدا کردین از طریق کد دوم، پیام مورد نظرتون رو به اون ارسال کنید

Hamid_PaK
یک شنبه 06 اسفند 1385, 17:01 عصر
دقت نکردی دوست عزیز دکمه های یک Toolbar رو نمی توان با دریافت child های آن بدست آورد اگر کمی به این کد دقت کنید ...


type
TTBButton = packed record
iBitmap: Integer;
idCommand: Integer;
fsState: Byte;
fsStyle: Byte;
bReserved: array[1..2] of Byte;
dwData: Longint;
iString: Integer;
end;

var
lptbbutton: TTBButton;
begin
SendMessage(hToolbar, TB_GETBUTTON, idButton, Integer(@lptbbutton));
end;



The TB_GETBUTTON message retrieves information about the specified button in a toolbar.

TB_GETBUTTON
wParam = (WPARAM) iButton;
lParam = (LPARAM) (LPTBBUTTON) lpButton;


Parameters

iButton

Zero-based index of the button for which to retrieve information.

lpButton

Pointer to the TBBUTTON structure that receives the button information.



Return Values

Returns TRUE if successful or FALSE otherwise

می توانید به این نکته برسید که برای رسیدن به دکمه یک Toolbar به روشی دیگر باید عمل کرد !!!
ولی مشکل اینجاست که چگونه عمل کلیک بر روی آن را شبیه سازی کنیم !!!

یا حق ...