1

Тема: AHK: Cкрыть/показать строки контекстного меню "windows"

Доброго времени суток. Подскажите пожалуйста как можно скрыть несколько строк контекстного меню "windows"(что бы было видно строки :открыть, изменить, вырезать, копировать, создать ярлык, удалить, переименовать , свойства) , а при удержании клавиши "shift" показать все остальные скрытые строки контекстного меню.

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

2

Re: AHK: Cкрыть/показать строки контекстного меню "windows"

Полагаю никак. Некоторые системные пункты меню удаляются только через Resource Hacker.
http://www.sevenforums.com/customizatio … -menu.html
Остальные удаляются через реестр.

3

Re: AHK: Cкрыть/показать строки контекстного меню "windows"

Да удалить через реестр не проблема ,а вот скрыть как?

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

4

Re: AHK: Cкрыть/показать строки контекстного меню "windows"

Можно отслеживать правый клик мыши.
И при нажатии shift повторно кликать в то же место, но с уже добавленными пунктами.

5

Re: AHK: Cкрыть/показать строки контекстного меню "windows"

Зачем скрывать? Просто блокировать щелчок мыши. Ну а если скрывать, то можно нажатие Esc посылать.

6

Re: AHK: Cкрыть/показать строки контекстного меню "windows"

Так задача, как я понял, скрыть некоторые пункты меню, чтоб их не было видно.
Так как когда их много, то становится неудобно выбирать.
Но иногда они могут пригодиться, поэтому и показывать их при нажатии шифт.

7

Re: AHK: Cкрыть/показать строки контекстного меню "windows"

Я так и понял. Но изменить контекстное меню вряд ли возможно. Оно для разных объектов разное.
Можно проверять класс окна и объект под курсором. Если это Explorer и не зажат Shift, вызвать самодельное контекстное меню. Если это Explorer и зажат Shift, то послать щелчок ПКМ.

8 (изменено: Malcev, 2016-03-11 01:04:39)

Re: AHK: Cкрыть/показать строки контекстного меню "windows"

Но изменить контекстное меню вряд ли возможно

Почему же? Как-раз таки весь мусор легко удалить.
Просто я понял задачу, что если после появления усеченного контексного меню, зажать шифт, то должны появиться дополнительные пункты. А если просто сделать 2 горячих кнопки, то можно так:

RButton::
CM_DelMenuItem( "ahk", "Test 1 2 3 " )
Send {RButton down}
KeyWait, RButton
Send {RButton up}
return

+RButton::
CM_AddMenuItem( "ahk", "&Test 1 2 3 ", "Notepad ""%1""" )
Send {RButton down}
KeyWait, RButton
Send {RButton up}
return

CM_AddMenuItem( ext, label, command ) {
  If( ext = "" or label = "" or command = "" )
    Return false
    
  CleanLabel := RegExReplace( label, "\W", "" )
  RegRead FileType, HKCR, .%ext%
  If( Not FileType )
    Return false
    
  RegWrite REG_SZ, HKCR, %FileType%\shell\%CleanLabel%,, %label%
  RegWrite REG_SZ, HKCR, %FileType%\shell\%CleanLabel%\command,, %command%
  
  Return true
}


CM_DelMenuItem( ext, label ) {
  If( ext = "" or label = "" )
    Return false
    
  CleanLabel := RegExReplace( label, "\W", "" )
  RegRead FileType, HKCR, .%ext%
  If( Not FileType )
    Return false
    
  RegDelete HKCR, %FileType%\shell\%CleanLabel%

  Return true
}

9 (изменено: Ядрён, 2016-03-11 01:55:30)

Re: AHK: Cкрыть/показать строки контекстного меню "windows"

Вот тут подумал немного и кое что придумал ,а что если переименовывать ключ реестра "HKEY_CLASSES_ROOT, *\shellex" в "HKEY_CLASSES_ROOT, *\shellex1" при нажатии на "RButton"и переименовывать обратно при нажатии "+RButton".По крайней мере при физическом переименовании (конкретно в реестре),очень много элементом контекстного меню пропадает.

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

10

Re: AHK: Cкрыть/показать строки контекстного меню "windows"

Вот софтинка есть:
http://www.nirsoft.net/utils/shell_menu_view.html

11

Re: AHK: Cкрыть/показать строки контекстного меню "windows"

Можно и в таком направлении посмотреть.


#SingleInstance Force
#NoEnv
SetBatchLines -1
#Persistent

StringCaseSense, Locale

SetWinEventHook("EVENT_OBJECT_SHOW", 0x8002) 
Return

RemoveMenu(hMenu, hWnd)
{   
	Loop, % DllCall("GetMenuItemCount", "Uint", hMenu) + Index := 0
	{
		idx := Index++
		idn := DllCall("GetMenuItemID", "Uint", hMenu, "int", idx) 
		nSize++ := DllCall("GetMenuString", "Uint", hMenu, "int", idx, "Uint", 0, "int", 0, "Uint", 0x400)
		nSize := (nSize * (A_IsUnicode ? 2 : 1)) 
		VarSetCapacity(sString, nSize)
		DllCall("GetMenuString", "Uint", hMenu, "int", idx, "str", sString, "int", nSize, "Uint", 0x400)   ;MF_BYPOSITION 
		StringReplace, sString, sString, &, , 1 
		If sString not in открыть,изменить,вырезать,копировать,создать ярлык,удалить,переименовать,свойства 
			DllCall("RemoveMenu","Int",hMenu,"UInt",idx,"Uint","0x00000400"), Index--   
	} 
}

EVENT_OBJECT_SHOW(hWinEventHook, event, hwnd, idObject, idChild) {
	If (idObject || idChild)
		Return 
	WinGetClass, Class, % "ahk_id " hwnd
	If Class != #32768
		Return
	WinGet, Process, ProcessName, % "ahk_id " hwnd
	If Process != explorer.exe
		Return  
	SendMessage, 0x1E1, 0, 0, , ahk_id %hwnd%      ; MN_GETHMENU
	hMenu := ErrorLevel 
	RemoveMenu(hMenu, hWnd)    
}

SetWinEventHook(EventProc, eventMin, eventMax = 0)
{  
	Return DllCall("SetWinEventHook"
				, "UInt", eventMin, "UInt", eventMax := !eventMax ? eventMin : eventMax
				, "Ptr", hmodWinEventProc := 0, "Ptr", lpfnWinEventProc := RegisterCallback(EventProc, "F")
				, "UInt", idProcess := 0, "UInt", idThread := 0
				, "UInt", dwflags := 0x0|0x2, "Ptr")	;	WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS 
} 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

12

Re: AHK: Cкрыть/показать строки контекстного меню "windows"

serzh82saratov ,то что нужно но только в нижней части экрана меню появляется значительно выше курсора. А так если бы доработать было бы просто супер.

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

13 (изменено: serzh82saratov, 2016-03-12 05:46:58)

Re: AHK: Cкрыть/показать строки контекстного меню "windows"

Немного поправил, но до нормального варианта далеко.


#SingleInstance Force
#NoEnv
SetBatchLines -1
#Persistent
CoordMode, Mouse
StringCaseSense, Locale

SetWinEventHook("EVENT_OBJECT_SHOW", 0x8002)
SetWinEventHook("EVENT_OBJECT_DESTROY", 0x8001)
Return

#If hWndMenu
LShift::
	NoRemove := 1
	WinClose, ahk_id %hWndMenu%
	MouseMove, menuX, menuY, 0
	Click Right
	KeyWait LShift
	NoRemove := 0
	If !hWndMenu
		Return
	WinClose, ahk_id %hWndMenu%
	MouseMove, menuX, menuY, 0
	Click Right
	Return 
#If

RemoveMenu(hWnd) {
	Global hWndMenu, menuX, menuY
	SendMessage, 0x1E1, 0, 0, , ahk_id %hwnd%		;	MN_GETHMENU
	If !(hMenu := ErrorLevel)
		Return
	WinSet, Region, 0-0 w0 h0, % "ahk_id " hwnd
	MouseGetPos, menuX, menuY
	hWndMenu := hWnd
	Loop, % DllCall("GetMenuItemCount", "Uint", hMenu) + Index := 0
	{
		idx := Index++
		idn := DllCall("GetMenuItemID", "Uint", hMenu, "Int", idx)
		nSize++ := DllCall("GetMenuString", "Uint", hMenu, "Int", idx, "Uint", 0, "Int", 0, "Uint", 0x400)
		nSize := (nSize * (A_IsUnicode ? 2 : 1))
		VarSetCapacity(String, nSize)
		DllCall("GetMenuString", "Uint", hMenu, "Int", idx, "Str", String, "Int", nSize, "Uint", 0x400)		;	MF_BYPOSITION
		StringReplace, String, String, &, , 1
		If String not in открыть,изменить,вырезать,копировать,создать ярлык,удалить,переименовать,свойства
			DllCall("RemoveMenu", "Int", hMenu, "UInt", idx, "Uint", "0x00000400"), Index--
	}
	WinMove, % "ahk_id " hwnd, , menuX, menuY
	WinSet, Region, , % "ahk_id " hwnd
}

EVENT_OBJECT_SHOW(hWinEventHook, event, hwnd, idObject, idChild) {
	Global NoRemove, hWndMenu
	If (idObject || idChild)
		Return
	WinGetClass, Class, % "ahk_id " hwnd
	If Class != #32768
		Return
	WinGet, Process, ProcessName, % "ahk_id " hwnd
	If Process != explorer.exe
		Return
	If NoRemove
		hWndMenu := hwnd
	Else
		RemoveMenu(hWnd)
}

EVENT_OBJECT_DESTROY(hWinEventHook, event, hwnd, idObject, idChild) {
	Global hWndMenu
	If (idObject || idChild || hWndMenu != hwnd)
		Return
	hWndMenu := 0
}

SetWinEventHook(EventProc, eventMin, eventMax = 0)
{
	Return DllCall("SetWinEventHook"
				, "UInt", eventMin, "UInt", eventMax := !eventMax ? eventMin : eventMax
				, "Ptr", hmodWinEventProc := 0, "Ptr", lpfnWinEventProc := RegisterCallback(EventProc, "F")
				, "UInt", idProcess := 0, "UInt", idThread := 0
				, "UInt", dwflags := 0x0 | 0x2, "Ptr")	;	WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

14

Re: AHK: Cкрыть/показать строки контекстного меню "windows"

serzh82saratov
Почти уже , только вот на пустом месте когда кликаешь "RButton" ничего не происходит.

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

15 (изменено: stealzy, 2016-03-14 13:49:56)

Re: AHK: Cкрыть/показать строки контекстного меню "windows"

Встроенное в windows решение для каждого пункта меню в отдельности:
добавлять пустой строковый параметр Extended в ...\shell\MyItem, где MyItem - раздел, отвечающий за пункт меню.
- не работает для пунктов, за показ которых отвечают библиотеки (notepad++).
Наглядная утилита от nirsoft - http://www.nirsoft.net/utils/shell_menu_view.html
P.S. Упс, Malcev уже писал.

16

Re: AHK: Cкрыть/показать строки контекстного меню "windows"

Ядрён пишет:

serzh82saratov
Почти уже , только вот на пустом месте когда кликаешь "RButton" ничего не происходит.

У меня появляется, может у вас в нём нет тех пунктов, если после LShift нажать ничего нет?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui