سلام
چطور میشه منوی راست کلیک برنامه رو عوض کرد (زمانی که روی Taskbar یا TitleBar راست کلیک میکنیم)
Printable View
سلام
چطور میشه منوی راست کلیک برنامه رو عوض کرد (زمانی که روی Taskbar یا TitleBar راست کلیک میکنیم)
آقایون من عجله ندارم ولی اگر میبینید پست میدم واسه اینه که تاپیک بیاد بالا تا دیده بشه
منظورتون از عوض كردن چيه دقيق تر توضيح بديد
حالت اول
قرار دادن يك منو لابلاي منو هاي ديگر و اضافه كردن يك منودر انتهاي منو هاي موجود:
شما دو تا كار بايد بكنيد:اول بايد منوتون رو قرار بديد دوم بايد پروسه هندل كردن رويداد هاي منو هاي قرار داده شده رو تعريف كنيد.
براي دستكاري منويي كه منظورتونه اولي handle اونو با توابع زير به كار ببريد:
RemoveMenu
DeleteMenu
InsertMenu
ModifyMenu
AppendMenu
CreatePopupMenu
GetSubMenu
GetSystemMenu
براي پروسه پاسخگويي به رويداد ها از hooking استفاده كنيد:
CallWindowProc
SetWindowLong
سلام دوست عزیز شرمنده که سوالم واضح نبود
منظور من دقیقا این منوی
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
البته ببخشید وی.بی6 خراب شده بود نتونستم با اون نشون بدم با .Net نشون دادم
لطفا تمام مراحل از قبیل گرفتن hWnd حذف، اضافه، کد نویسی و هر چیز دیگه ای که لازمه چون تا حالا با ای.پی.آی های منو کار نکردم
ممنون
MrJamshidy خوبي؟نمي خواي اسمتو به ما بگي؟:31:
كلا به اين توابع نياز داريد
API declerationکد:Option Explicit
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function GetProp Lib "user32" Alias "GetPropA" (ByVal hWnd As Long, _
ByVal lpString As String) As Long
Declare Function RemoveProp Lib "user32" Alias "RemovePropA" (ByVal hWnd As Long, _
ByVal lpString As String) As Long
Declare Function GetMenu Lib "user32" (ByVal hWnd As Long) As Long
Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, _
ByVal wFlags As Long) As Long
Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, _
ByVal wFlags As Long) As Long
Declare Function InsertMenu Lib "user32" Alias "InsertMenuA" (ByVal hMenu As Long, _
ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, _
ByVal lpNewItem As Any) As Long
Declare Function ModifyMenu Lib "user32" Alias "ModifyMenuA" (ByVal hMenu As Long, _
ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, _
ByVal lpString As String) As Long
Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" (ByVal hMenu As Long, _
ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As String) As Long
Declare Function CreatePopupMenu Lib "user32" () As Long
Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As Long, ByVal bRevert As Long) As Long
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
ConstantsHooking or subclassingکد:Public Const MF_ENABLED = &H0&
Public Const MF_STRING = &H0&
Public Const MF_GRAYED = &H1&
Public Const MF_DISABLED = &H2&
Public Const MF_POPUP = &H10&
Public Const MF_BYPOSITION = &H400&
Public Const MF_SEPARATOR = &H800&
Public Const WM_CLOSE = &H10
Public Const WM_COMMAND = &H111
Public Const WM_SYSCOMMAND = &H112
Public Const WM_MENUSELECT = &H11F
Public Const WM_USER = &H400
Public Const GWL_WNDPROC = (-4)
تو مرحله بالا اجراي تابع دوم برنامه رو error freeميكنه مراقب اون باشيد و حتما قبل از خروج از برنامه اونو فراخواني كنيد!!کد:Public OldWinProc As Long
Public Function NewWindowProc(ByVal inHWND As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_COMMAND Then
If wParam >= 1001 And wParam <= 2010 Then
If wParam = 1002 Then
MsgBox "Sub submenu 1002 clicked"
Exit Function
ElseIf wParam = 2001 Then
MsgBox "Sub submenu 2001 clicked"
Exit Function
ElseIf wParam = 2002 Then
MsgBox "Sub submenu 2002 clicked"
Exit Function
End If
Exit Function
End If
ElseIf Msg = WM_SYSCOMMAND Then
If wParam = 0 Then
MsgBox "Inserted item clicked"
Exit Function
ElseIf wParam = 999 Then
MsgBox "Appended item clicked"
Exit Function
End If
End If
NewWindowProc = CallWindowProc(OldWinProc, inHWND, Msg, wParam, lParam)
End Function
Public Sub RemoveOldProc(inHWND)
Dim tmpProc As Long
tmpProc = GetProp(inHWND, "OldWinProc")
If tmpProc = 0 Then
Exit Sub
End If
RemoveProp inHWND, "OldWinProc"
SetWindowLong inHWND, GWL_WNDPROC, tmpProc
End Sub
عزیز اسمم "علی"نقل قول:
مگر نمیدونستی:18:
خوب این چه سوالیه؟ از کجا باید میدونستی؟
حالا اسمم رو میخواید چیکار؟
میتونی برام یک سورس بزاری (لطفا) در مورد همون منویی که گفتم
ممنون
برا ما همون مستر جمشیدی هستی !!!:10:
.................................................|.... |
.........................................این تویی... اینم منم
آقا راستی برای گزاشتن عکس کنار همون منو که دوستمون توضیح داد چیکار باید بکنیم ؟
یه کد دارم برای این کار ولی سر در نمیارم !!!
خوب با اسم بهتر نيست علي آقا اگه دوست داري همون MrJamshidy صدات كنم؟نقل قول:
ok check this out:نقل قول:
اول بايد هندل منو رو بگيري:
حالا ميتوني يه آيتم اونو حذف كني:کد:mSysMenu = GetSystemMenu(hWnd, False)
يه آيتم توش بزاري:کد:DeleteMenu mSysMenu, 0, MF_BYPOSITION
يه خط فاصله يا separatorبهش اضافه كنيکد:InsertMenu mSysMenu, 0, MF_BYPOSITION, MF_STRING + MF_ENABLED, "Inserted item"
يا اين خط فاصله رو به انتهاش اضافه كني:کد:InsertMenu mSysMenu, 1, MF_BYPOSITION, MF_SEPARATOR, vbNullString
يا آيتمت رو به انتهاش اضافه كني:کد:AppendMenu mSysMenu, MF_SEPARATOR, 0, ""
کد:AppendMenu mSysMenu, MF_STRING + MF_ENABLED, 999, "Appended item"