我可以在Windows文本编辑上下文菜单中添加自定义粘贴选项吗?

时间:2013-06-28 17:27:23

标签: windows contextmenu clipboard paste

我正在寻找一种在WinXP机器上编辑文本时向右键单击上下文菜单添加选项的方法。我已经对它进行了大量的复制/粘贴,因此剪贴板总是在变化,但是在我编辑的几乎每个文件中都有一个我反复输入的字符串。

我已经在.zip文件的上下文菜单中添加了一些自定义选项来批量解压缩它们,但我没有找到添加它的方法。

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

3 个答案:

答案 0 :(得分:0)

我认为这种事情没有延伸点。您必须将代码注入到具有带文本框控件的窗口的每个进程中,这对于大多数反病毒应用程序来说都是复杂和不受欢迎的。

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

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

答案 1 :(得分:0)

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

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

Is it possible to catch the close button and minimize the window instead? AutoHotKey

类似的问题: Can I edit the context menu of a text field (not Explorer context menu)?

注意:
- 对于输入长/重复字符串,在AutoHotkey中使用热字串可以真正促进这一点。可以实现一行代码。
- 对于涉及zip文件的批处理作业,可以尝试7-Zip并使用AutoHotkey中的命令行参数。这可能是在大约10或20行代码中实现的。

AutoHotkey非常轻巧,大约1MB,您可以尝试一两天,可能会看到一个简短的“hello world'教程视频,它可以很容易上手。

答案 2 :(得分:0)

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

该脚本显示自定义上下文菜单, 右键单击Edit控件时 或者当聚焦编辑控件并按下AppsKey时。

注意:以下脚本在Windows 7上进行测试, 但这些方法应该适用于Windows XP。

注意:Explorer地址栏也使用Edit控件, 但是,脚本会将此考虑在内。

注意:您请求了一个轻量级的方法, AutoHotkey可以使用一个exe文件(大小不超过2MB)运行, 和一个脚本文件。脚本也可以编译成小前辈。<​​/ p>

;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 ; A-Z
            || Code >= 0x61 && Code <= 0x7A) ; a-z
            Res .= Chr(Code)
        Else
            Res .= "%" . SubStr(Code + 0x100, -1)
    SetFormat, IntegerFast, %f%
    Return, Res
}

;==================================================