我可以添加一个自定义粘贴选项到Windows文本编辑上下文菜单?

我正在寻找在WinXP机器上编辑文本时向右键上下文菜单添加选项的方法。 我已经做了很多复制/粘贴,所以剪贴板总是在变化,但是我编辑的每个文件中都有一个string被反复input。

我已经为.zip文件的上下文菜单添加了一些自定义选项来批量解压,但我没有find一种方法来添加这个。

该机器用于一个单一的目的,我尽量保持它尽可能稳定,所以我试图远离任何新的第三方软件,可能会膨胀系统。

Solutions Collecting From Web of "我可以添加一个自定义粘贴选项到Windows文本编辑上下文菜单?"

我不认为有这样的事情的延伸点。 您必须将代码注入到每个带有文本框控件的窗口的进程中,这对大多数反病毒应用程序来说都会变得复杂而且令人不快。

我知道你说过你想避免使用第三方软件,但是真的没有办法解决这个问题。 像AutoIt这样的程序将允许你创建一个自定义的键盘快捷方式来粘贴你喜欢的任何文本到几乎任何应用程序。 它可能会比短期内编写的任何定制程序稳定得多。

如果你不想在机器上安装整个AutoIt发行版,甚至可以将自动化脚本编译为独立的可执行文件。

该问题询问如何编辑Edit控件的上下文菜单,它稍微不清楚是否需要重命名或编辑文件,下面的AutoHotkey脚本在编辑Explorer中的文件和使用记事本时复制Edit控件菜单。 它添加一个按钮,将一个字符串发送到编辑控件。

该脚本显示一个自定义的上下文菜单,当右键单击编辑控件,或者当一个编辑控件被关注并且AppsKey被按下时。

注意:下面的脚本在Windows 7上进行了测试,但这些方法应该在Windows XP上运行。

注意:资源管理器地址栏也使用编辑控件,但脚本考虑到了这一点。

注意:你需要一个轻量级的方法,AutoHotkey可以运行一个exe文件(在2MB以下)和一个脚本文件。 脚本也可以编译成小的。

 ;AutoHotkey script for: ;contextmenu - Can I add a custom paste option to the windows text editing context menu? - Stack Overflow ;http://stackoverflow.com/questions/17370415/can-i-add-a-custom-paste-option-to-the-windows-text-editing-context-menu/41343891#41343891 ;see also: ;windows - Can I edit the context menu of a text field (not Explorer context menu)? - Stack Overflow ;http://stackoverflow.com/questions/39827324/can-i-edit-the-context-menu-of-a-text-field-not-explorer-context-menu/41343741#41343741 ;tested on Windows 7 GroupAdd, WinGroupFolder, ahk_class CabinetWClass ;explorer #IfWinActive, ahk_group WinGroupFolder $RButton Up:: ;explorer - custom Edit control menu $AppsKey:: ;explorer - custom Edit control menu #IfWinActive, ahk_class Notepad $RButton Up:: ;notepad - custom Edit control menu $AppsKey:: ;notepad - custom Edit control menu ;STAGE - create menu if not already created if !vIsReady { Menu, EditMenu, Add, &My Item, MyItem Menu, EditMenu, Add ;------------------------------ Menu, EditMenu, Add, &Undo, EditUndo Menu, EditMenu, Add ;------------------------------ Menu, EditMenu, Add, Cu&t, EditCut Menu, EditMenu, Add, &Copy, EditCopy Menu, EditMenu, Add, &Paste, EditPaste Menu, EditMenu, Add, &Delete, EditDelete Menu, EditMenu, Add ;------------------------------ Menu, EditMenu, Add, Select &All, EditSelectAll VarSetCapacity(vPos1, 4), VarSetCapacity(vPos2, 4) VarSetCapacity(vPos1X, 4), VarSetCapacity(vPos2X, 4) vIsReady := 1 } ;STAGE - perform certain checks, if any of them fail ;then let hotkeys perform their normal function, ;start by stating that, so far, the checks have not failed vRet := 1 ;check - if active control is an Edit/RichEdit control if vRet { WinGet, hWnd, ID, A ControlGetFocus, vCtlClassNN, ahk_id %hWnd% ControlGet, hCtl, Hwnd, , %vCtlClassNN%, ahk_id %hWnd% WinGetClass, vWinClass, ahk_id %hCtl% if !(SubStr(vWinClass, 1, 4) = "Edit") && !(SubStr(vWinClass, 1, 8) = RichEdit) vRet := 0 } ;check - if a right-click was performed, the control ;under the cursor must be the active control if vRet && InStr(A_ThisHotkey, "RButton") { CoordMode, Mouse, Screen MouseGetPos, vPosX, vPosY, , hCtl2, 3 if !(hCtl2 = hCtl) vRet := 0 } ;check - the Edit control must be for a file icon and not the address bar if vRet { ;hWndParent := DllCall("user32\GetParent", Ptr,hCtl, Ptr) hWndParent := DllCall("user32\GetAncestor", Ptr,hCtl, UInt,1, Ptr) ;GA_PARENT := 1 WinGetClass, vWinClassParent, ahk_id %hWndParent% if (vWinClassParent = "ComboBox") vRet := 0 } ;if a check has failed, then let hotkeys perform their normal function if !vRet { if InStr(A_ThisHotkey, "RButton") SendInput {Click right} if InStr(A_ThisHotkey, "AppsKey") SendInput {AppsKey} Return } ;STAGE - if clicked Edit control, menu will appear ;relative to cursor coordinates retrieved earlier, ;if pressed AppsKey, menu will appear in centre of Edit control if !InStr(A_ThisHotkey, "RButton") { WinGetPos, vPosX, vPosY, vPosW, vPosH, ahk_id %hCtl% vPosX += vPosW/2, vPosY += vPosH/2 } ;STAGE - retrieve information from Edit control ;and disable menu items accordingly ;Undo - check undo status (is undo available) ;Cut - check text selection > 0 ;Copy - check text selection > 0 ;Paste - check clipboard not empty ;Delete - check text selection > 0 ;Select All - always available SendMessage, 0xC6, 0, 0, , ahk_id %hCtl% ;EM_CANUNDO := 0xC6 vOptU := ErrorLevel ? "En" : "Dis" ;1=undo available/0=undo not available ControlGet, vText, Selected, , , ahk_id %hCtl% vOptT := StrLen(vText) ? "En" : "Dis" vOptC := StrLen(Clipboard) ? "En" : "Dis" Menu, EditMenu, % vOptU "able", &Undo, EditUndo Menu, EditMenu, % vOptT "able", Cu&t, EditCut Menu, EditMenu, % vOptT "able", &Copy, EditCopy Menu, EditMenu, % vOptC "able", &Paste, EditPaste Menu, EditMenu, % vOptT "able", &Delete, EditDelete ;STAGE - get Edit control character positions ;(unfortunately showing the custom menu ends the rename mode, ;we get the Edit control character positions in order to restore them later) SendMessage, 0xB0, &vPos1, &vPos2, , ahk_id %hCtl% ;EM_GETSEL := 0xB0 vPos1 := NumGet(vPos1), vPos2 := NumGet(vPos2) ;STAGE - show menu CoordMode, Menu, Screen Menu, EditMenu, Show, %vPosX%, %vPosY% Return ;============================== ;STAGE - replicate standard Edit control menu items ;(or perform custom menu function) ;(unfortunately showing the custom menu ends the rename mode, ;so the Edit control has to be put into rename again, ;and the character positions restored) EditUndo: EditCut: EditCopy: EditPaste: EditDelete: EditSelectAll: MyItem: ;STAGE - enter rename mode again IfWinActive, ahk_group WinGroupFolder { SendInput {F2} Loop, 20 { ControlGetFocus, vCtlClassNN, ahk_id %hWnd% if (SubStr(vCtlClassNN, 1, 4) = "Edit") break Sleep 50 } if !(SubStr(vCtlClassNN, 1, 4) = "Edit") { MsgBox % "error" Return } ControlGet, hCtl, Hwnd, , % vCtlClassNN, ahk_id %hWnd% ;STAGE - restore character positions if !InStr(A_ThisLabel, "SelectAll") { vRet := 0 Loop, 100 { SendMessage, 0xB1, vPos1, vPos2, , ahk_id %hCtl% ;EM_SETSEL := 0xB1 SendMessage, 0xB0, &vPos1X, &vPos2X, , ahk_id %hCtl% ;EM_GETSEL := 0xB0 vPos1X := NumGet(vPos1X), vPos2X := NumGet(vPos2X) if (vPos1 = vPos1X) && (vPos2 = vPos2X) { vRet := 1 break } Sleep 50 if !vRet { MsgBox % "error" Return } } } } ;STAGE - perform standard Edit control menu functions if InStr(A_ThisLabel , "Undo") SendMessage, 0x304, , , , ahk_id %hCtl% ;WM_UNDO := 0x304 if InStr(A_ThisLabel , "Cut") SendMessage, 0x300, , , , ahk_id %hCtl% ;WM_CUT := 0x300 if InStr(A_ThisLabel , "Copy") SendMessage, 0x301, , , , ahk_id %hCtl% ;WM_COPY := 0x301 if InStr(A_ThisLabel , "Paste") SendMessage, 0x302, , , , ahk_id %hCtl% ;WM_PASTE := 0x302 if InStr(A_ThisLabel , "Delete") SendMessage, 0x303, , , , ahk_id %hCtl% ;WM_CLEAR := 0x303 if InStr(A_ThisLabel , "SelectAll") SendMessage, 0xB1, 0, -1, , ahk_id %hCtl% ;EM_SETSEL := 0xB1 ;STAGE - actions to take if user chooses custom menu item if InStr(A_ThisLabel , "MyItem") { vText := "My String" ;ControlSend, , % vText, ahk_id %hCtl% ;use SendInput instead since capitalisation can be unreliable SendInput {Raw}%vText% } ;STAGE - actions to take if user chooses custom menu item if 0 ;this comments out the 9 lines below if InStr(A_ThisLabel , "MyItem") && !(vText = "") { MsgBox, 0x40003, , % "Choose 'Yes' to search for:`r`n" vText IfMsgBox Yes { vUrl := "http://www.google.co.uk/search?q=" UriEncode(vText) Run, "%vUrl%" } } Return #IfWinActive ;================================================== ;URL encoding - Rosetta Code ;https://www.rosettacode.org/wiki/URL_encoding#AutoHotkey ; Modified from https://autohotkey.com/board/topic/75390-ahk-l-unicode-uri-encode-url-encode-function/?p=480216 UriEncode(Uri) { VarSetCapacity(Var, StrPut(Uri, "UTF-8"), 0) StrPut(Uri, &Var, "UTF-8") f := A_FormatInteger SetFormat, IntegerFast, H While Code := NumGet(Var, A_Index - 1, "UChar") If (Code >= 0x30 && Code <= 0x39 ; 0-9 || Code >= 0x41 && Code <= 0x5A ; AZ || Code >= 0x61 && Code <= 0x7A) ; az Res .= Chr(Code) Else Res .= "%" . SubStr(Code + 0x100, -1) SetFormat, IntegerFast, %f% Return, Res } ;================================================== 

假设你指的是Edit控件的上下文菜单。 您可以通过使用AutoHotkey克隆和修改Edit控件上下文菜单来实现这一点。 如果上下文菜单是用于不同类型的控制的,则适用相同的原则,但是重新创建现有的菜单项功能可能更困难。

要“添加”一个菜单项,最简单的方法是用你自己的自定义上下文菜单替换整个菜单。 在您的自定义菜单项的顶部,您可能会想要重新创建编辑控件上出现的撤消/剪切/复制/粘贴/删除/选择所有项目。 使用ControlGet, vText, Selected例如重新创建复制功能。 您可以使用#IfWinActive使菜单仅在某个窗口处于活动窗口时出现,例如只有在记事本是活动窗口的情况下。 您还需要通过RButton热键捕获右键单击和/或捕获AppsKey按键,并使用ControlGetFocus检查Edit控件是否处于焦点状态, MouseGetPos检查Edit控件是否位于光标下方。 所以会涉及一些工作。 关于捕捉右键单击,请参阅下面的链接,您将在哪里用RButton替换LButton。 祝你好运!

是否有可能赶上关闭按钮,并尽量减少窗口? AutoHotkey的

类似的问题: 我可以编辑文本字段(不是资源管理器上下文菜单)的上下文菜单吗?

注意:
– 对于输入长/重复的字符串,在AutoHotkey中使用hotstrings可以真正帮助这个。 字面上可以实现一行代码。
– 对于涉及zip文件的批处理作业,可以尝试使用7-Zip并使用AutoHotkey中的命令行参数。 这大概可以在10或20行代码中实现。

AutoHotkey非常轻便,大约1MB,你可以试试一两天,可能看一个简短的“你好世界”的教程视频,它可以很容易上手。