Заснемане на опцията, избрана от потребителя в контекстното меню по подразбиране на Windows?

Когато щракнете с десния бутон върху текстово поле, което има контекстното меню на Windows по подразбиране, искам да знам дали потребителят избира copy cut или paste опция, за да извърша вторични операции, когато потребителят е избрал конкретна опция от контекстното меню.

Нямам код, защото не знам откъде да започна да се опитвам да разпозная коя опция е избрана от потребителя в контекстното меню и как да уловя това щракване с ляв бутон, защото се опитах да уловя контекстното меню по подразбиране, щракнете с левия бутон на мишката върху текстово поле MouseDown/Mouseclick събития без успех, знам, че това няма много смисъл, защото е щракване с мишката в контекстно меню, а не щракване с мишката в текстово поле, но добре... Не знам как да управлявам това външно контекстно меню.


person ElektroStudios    schedule 21.10.2013    source източник
comment
Тъй като искате да предоставите свои собствени действия, трябва да замените ContextMenu по подразбиране - дори ако тези действия са "вторични". Вероятно по-малко код и по-лесно, отколкото да се опитвате да се свържете с Win/Net.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 21.10.2013
comment
@Plutonix Така съм се справял винаги. След това можете ръчно да добавите неща към клипборда или просто да извикате клавиша за бърз достъп SendKeys.SendWait("[CTRL]+C")   -  person Steve    schedule 21.10.2013
comment
Само пример: да предположим, че искам само да хвърля MsgBox, когато потребителят избере опция за копиране или поставяне в контекстното меню по подразбиране, това е, което искам. Благодаря за прочетеното!   -  person ElektroStudios    schedule 21.10.2013
comment
@Plutonix Не се интересувам от замяна на контекстното меню по подразбиране с персонализирано контекстно меню в това приложение, Probably less code and easier than... зависи от това дали ще бъде лесна cm или пълна замяна, cm по подразбиране има множество опции за IME и наистина ще ви трябват много код за възпроизвеждане на всички тези опции, като опцията за управление на Unicode... в противен случай просто правя контекстно меню с опции за копиране/изрязване/поставяне. Не ми харесва, но да има нужда само от малко редове код, но не изглежда много професионално ( за текстово поле). Не ми трябва в това приложение.   -  person ElektroStudios    schedule 21.10.2013
comment
непрофесионално?? Опитвам се да си спомня последния път, когато съм виждал CTM по подразбиране във всяко приложение. Ако имате нужда от него, добре, но не се преструвайте, че е от съществено значение, повечето приложения могат да „попречат на оформянето на арабски форми“.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 21.10.2013
comment
Съжалявам, не исках да обидя никого, просто за мен според мен не изглежда професионално, персонализиран CM за всеки друг тип контрол го смятам за хубав, но не и за контрол TextBox, винаги съм виждал на всички apps CM по подразбиране за TextBox, но се различаваме по това, така или иначе не мога да си представя кои персонализирани опции би могъл един човек да добави към персонализирано CM в текстово поле, тъй като текстовото поле по подразбиране CM на Windows има всички необходими опции!, благодаря за коментара.   -  person ElektroStudios    schedule 21.10.2013
comment
@ElektroStudios the windows default Textbox CM has all needed options, но му липсват желаните от вас функции. Поради тази причина @Plutonix има добро решение.   -  person djv    schedule 23.10.2013
comment
@DanVerdolino Щях да попитам защо започна темата/публикува награда, ако беше толкова перфектна. Очевидно не е възможно (AFAIK) да получите препратка към CTM по подразбиране и да закачите нови събития към него. Но е възможно да подкласифицирате CTM и да го накарате да предизвика ново събитие, за да уведоми, че предстои операция и да позволи на кода на формуляра да прекрати операцията. Оттам нататък е само малко детективска работа, за да го направим по-подобно на възвишената настройка по подразбиране (почти всички неща на Unicode са само вмъкване на знаци, а останалото е вътрешно за контрола).   -  person Ňɏssa Pøngjǣrdenlarp    schedule 23.10.2013


Отговори (2)


Можете да добавите клас като този към вашия проект:

Class MyTextBox : Inherits TextBox
  Public Enum ContextCommands
     WM_CUT = &H300
     WM_COPY = &H301
     WM_PASTE = &H302
  End Enum

  Public Class ContextCommandEventArgs
     Inherits EventArgs
     Public Property Command As ContextCommands
  End Class

  Event OnCut(sender As Object, e As ContextCommandEventArgs)
  Event OnCopy(sender As Object, e As ContextCommandEventArgs)
  Event OnPaste(sender As Object, e As ContextCommandEventArgs)

  Protected Overrides Sub WndProc(ByRef m As Message)
     MyBase.WndProc(m)
     Select Case m.Msg
        Case ContextCommands.WM_CUT
           RaiseEvent OnCut(Me, New ContextCommandEventArgs() With {.Command = ContextCommands.WM_CUT})
        Case ContextCommands.WM_COPY
           RaiseEvent OnCopy(Me, New ContextCommandEventArgs() With {.Command = ContextCommands.WM_COPY})
        Case ContextCommands.WM_PASTE
           RaiseEvent OnPaste(Me, New ContextCommandEventArgs() With {.Command = ContextCommands.WM_PASTE})
     End Select
  End Sub
End Class

След това можете да замените всички срещания на "TextBox" във файловете Designer.vb с "MyTextBox". Тогава ще имате достъп до 3 нови събития за изрязване, копиране и поставяне. Можете да се справите с тях така:

Private Sub TextBox1_OnTextCommand(sender As Object, e As MyTextBox.ContextCommandEventArgs) _
    Handles TextBox1.OnCut, TextBox1.OnPaste, TextBox1.OnCopy
    MessageBox.Show("Activated " & e.Command.ToString())
End Sub

Забележете как избрах да обработвам всичките 3 събития в една функция в този случай, но можете да ги обработвате и в отделни функции. Забелязах, че командата за изрязване изглежда също предизвиква събитие за команда за копиране, но засега предполагам, че можете да се справите с това леко усложнение.

person BlueMonkMN    schedule 23.10.2013
comment
Страхотно решение, благодаря ви много!. Съобщението WM_COPY се изпраща преди заедно с WM_CUT, когато щракна върху опцията Cut CMT, това може да се коригира, моля?, Питам това, защото трябва да управлявам WM_COPY и WM_CUT, което ще ми даде фалшив положителен резултат WM_COPY, когато щракна върху опцията CUT . - person ElektroStudios; 24.10.2013
comment
Да, вече споменах това поведение в отговора си. Можете ли да игнорирате wm_copy? Защо ви е грижа за заснемането на wm_copy? Не знам как да го поправя, но не съм сигурен, че наистина е грешно. Изрязването наистина е вид копиране, последвано от изрязване/изтриване. Така че не знам защо вашият код се интересува. Какво трябва да направи вашият код, ако потребителят току-що е избрал копие? - person BlueMonkMN; 24.10.2013
comment

Вашият PATH не е същият PATH, който има потребителският акаунт, под който работи VisualSVN Server.

Винаги посочвайте пълния, абсолютен път до всички елементи във вашите скриптове за закачки, независимо от това какъв SVN сървър и операционна система използвате.

C:\Perl64\bin\perl myhook.pl %1 %2
- person ElektroStudios; 24.10.2013
comment
Може би бихте могли да ми кажете константата за wm_delete, за да направя това, от което се нуждая? Не мога да го намеря в MSDN, благодаря за отделеното време - person ElektroStudios; 24.10.2013
comment
Намерено: WM_CLEAR = &H303, но за съжаление вашият клас няма да работи при наследяване на текстово поле на трета страна (напр. Krypton Textbox), моля, вижте нов въпрос тук, ако можете: stackoverflow.com/questions/19560844/ - person ElektroStudios; 24.10.2013

Ако някой има нужда от това, това е модификация на кода @BlueMonkMN, за да работи правилно с опцията CUT, а също така е добавена опцията DELETE.

Class MyTextBox : Inherits TextBox

Private Last_Command As ContextCommands = Nothing

Private WithEvents CopyOrCut_Timer As New Timer _
        With {.Interval = 5, .Enabled = False}

Public Enum ContextCommands
    WM_CUT = &H300
    WM_COPY = &H301
    WM_PASTE = &H302
    WM_DELETE = &H303
End Enum

Public Class ContextCommandEventArgs
    Inherits EventArgs
    Public Property Command As ContextCommands
End Class

Event OnCut(sender As Object, e As ContextCommandEventArgs)
Event OnCopy(sender As Object, e As ContextCommandEventArgs)
Event OnPaste(sender As Object, e As ContextCommandEventArgs)
Event OnDelete(sender As Object, e As ContextCommandEventArgs)

Protected Overrides Sub WndProc(ByRef m As Message)

    MyBase.WndProc(m)

    Select Case m.Msg

        Case ContextCommands.WM_COPY
            Last_Command = ContextCommands.WM_COPY
            CopyOrCut_Timer.Enabled = True

        Case ContextCommands.WM_CUT
            Last_Command = ContextCommands.WM_CUT

        Case ContextCommands.WM_PASTE
            RaiseEvent OnPaste(Me, New ContextCommandEventArgs() _
                                   With {.Command = ContextCommands.WM_PASTE})

        Case ContextCommands.WM_DELETE
            RaiseEvent OnDelete(Me, New ContextCommandEventArgs() _
                                    With {.Command = ContextCommands.WM_DELETE})

    End Select

End Sub

Private Sub Cut_Timer_Tick(sender As Object, e As EventArgs) _
Handles CopyOrCut_Timer.Tick

    sender.enabled = False

    Select Case Last_Command

        Case ContextCommands.WM_COPY
            RaiseEvent OnCopy(Me, New ContextCommandEventArgs() _
                                  With {.Command = ContextCommands.WM_COPY})

        Case ContextCommands.WM_CUT
            RaiseEvent OnCut(Me, New ContextCommandEventArgs() _
                                 With {.Command = ContextCommands.WM_CUT})

    End Select

    Last_Command = Nothing

End Sub

End Class
person ElektroStudios    schedule 24.10.2013