표준 파일의 컨텍스트 메뉴를 확장하는 것이 가능하지만 시스템 전체 텍스트 상자 컨텍스트 메뉴에 항목을 추가하는 방법이 있습니까?운영 체제의 모든 텍스트 상자에 컨텍스트 메뉴 항목 추가
이렇게하면 사용자가 Windows의 아무 곳이나 입력 할 수있는 모든 텍스트 상자에 새 항목이 표시됩니까?
예를 들어 맞춤법 검사기에서 선택한 텍스트를 조회하는 기능을 추가 할 수 있습니다.
표준 파일의 컨텍스트 메뉴를 확장하는 것이 가능하지만 시스템 전체 텍스트 상자 컨텍스트 메뉴에 항목을 추가하는 방법이 있습니까?운영 체제의 모든 텍스트 상자에 컨텍스트 메뉴 항목 추가
이렇게하면 사용자가 Windows의 아무 곳이나 입력 할 수있는 모든 텍스트 상자에 새 항목이 표시됩니까?
예를 들어 맞춤법 검사기에서 선택한 텍스트를 조회하는 기능을 추가 할 수 있습니다.
양식 및 컨텍스트 메뉴를 사용하여 Bind 메서드를 호출하십시오. 컨트롤이 폼이나 다른 추가 될 때마다이 호출에 바인딩 방법을 원인
c.ControlAdded += (s, e) => Bind(e.Control, menu);
: 동적 텍스트 상자를 추가하는 경우
void Bind(Control c, ContextMenu menu)
{
foreach (Control subcontrol in c.Controls)
Bind(subcontrol);
TextBox textBox = c as TextBox;
if (textBox != null)
{
textBox.ContextMenu = menu;
}
}
, 다음 바인딩 방법의 beggining에이를 배치 제어.
당신은 add a Mouse Hook
해야하고 다음을 클릭하는 윈도우/컨트롤이 텍스트 상자 때 상황에 맞는 메뉴를 팝업 것입니다.
숨기거나 충돌하기 때문에 이미 존재하는 상황에 맞는 메뉴를 방해 할 수 있습니다.
(끔찍한 계획이지만 ...)
이것은 기술적으로 C#에서는 불가능합니다. 다음 상황을 상상해보십시오. 관리되는 확장을 성공적으로 작성하고 시스템의 텍스트 상자 컨텍스트 메뉴를 "확장"한다고 가정하십시오. 물론 추가 한 각 새 메뉴 항목을 처리해야합니다. 이를 달성하려면 텍스트 상자가 있고 각자 WindProc
을 대체하는 각 프로세스에 관리 코드를 삽입해야합니다. 좋아, 귀하의 확장을 위해 사용하는 버전과 다른 .net 버전을 위해 작성된 시스템에 관리되는 응용 프로그램이 있다고 가정합니다. 따라서이 경우 확장 인젝션 중 심각한 오류가 발생합니다. 이는 프로세스 당 .net의 한 버전 만로드 될 수 있기 때문입니다. 따라서 강력한 관리 로우 레벨 훅 또는 셸 확장을 작성할 방법이 없습니다. here에서 :
글로벌 후크는 을 제외하고 .NET 프레임 워크
에서 지원되지 않습니다 Microsoft .NET Framework 전역 후크를 설치하려면 DLL 내보내기를 가져와 유효한 일치 함수를 호출해야하는 다른 프로세스에 자신을 삽입해야합니다. 이 동작에는 DLL 내보내기가 필요합니다. .NET Framework는 DLL 내보내기를 지원하지 않습니다. 관리되는 코드는 포인터에 대해 일관된 값의 포인터가 없으므로이 함수는 포인터는 동적으로 으로 작성된 프록시이기 때문입니다.낮은 수준의 후크 절차는 후크를 설치 한 스레드에서 이라고합니다. 하위 수준의 후크는 DLL에 후크 절차를 구현할 필요가 없습니다 ( ).
this 문서를 확인하고 관리되는 셸 확장을 쓰지 않아도되는지 알아볼 수 있습니다.
매우 재미있는 감사 – John
"운영 체제"와 같은 시스템 전체에 적용 되나요? –
예! 맞습니다. – John
매우 짜증나는 무언가를 만드는 것처럼 보입니다. –