Сделал форму, которая сейчас всегда невидима (в дальнейшем планирую использовать её для настройки пунктов меню), у неё есть ContextMenuStrip.
При запуске форма регистрирует сочетание клавиш Win+V. Когда эти клавиши нажимаются, определяется активное окно, выполняется привоединение к его потоку, для активного контрола запрашиваются границы выделения и положение текстового курсора на экране. После чего показывается и делается активным контекстное меню. При выборе в нём одного из пунктов, активируется то окно, которое до этого было активным, для контрола устанавливаются границы выделения, затем посылаются нажатия клавиш. В конце делается отсоединение от потока.
Всё это сделано и работает. Правда, сейчас подумал, что если ни один из пунктов меню не выбирается, отсоединение не происходит. Что ж, исправлю

Теперь, в чём проблема:
1. Если при открытом меню щёлкнуть мышью по какому-нибудь другому окну, оно не исчезнет.
2. Не работает с переименованием в Проводнике и подобных ему диалогами. Т. е. если вызвать меню во время переименования файла, то переименование прекращается (когда именно не знаю, но когда меню видимо и активно, текстовой области уже нет).
3. Не для всех программ определяется положение курсора. Есть ещё способы кроме GetCaretPos? Необязательно стандартные или работающие для всех окон. Просто какие-нибудь, можно с указанием класса, к которому они применимы.
4. Если стоял не английский язык, то латинские символы вводятся как русские. Но тут рядом была тема про языки, ещё её посмотрю - там был ответ, кажется. Просто не занимался ещё этим вопросом.
Приходил в голову вариант показывать меню, но не делать его активным, а ставить глобальных хук на нажатия клавиш и обрабатывать их. При закрытии меню этот хук снимать. Но что-то мне не нравится этот вариант... Да и не факт, что от этого будут какие-то плюсы.
PS: Moved from Наши проекты (11.06.2012 02:16 GMT+4)