2011-02-15 2 views
8

표준 파일의 컨텍스트 메뉴를 확장하는 것이 가능하지만 시스템 전체 텍스트 상자 컨텍스트 메뉴에 항목을 추가하는 방법이 있습니까?운영 체제의 모든 텍스트 상자에 컨텍스트 메뉴 항목 추가

이렇게하면 사용자가 Windows의 아무 곳이나 입력 할 수있는 모든 텍스트 상자에 새 항목이 표시됩니까?

예를 들어 맞춤법 검사기에서 선택한 텍스트를 조회하는 기능을 추가 할 수 있습니다.

+1

"운영 체제"와 같은 시스템 전체에 적용 되나요? –

+0

예! 맞습니다. – John

+2

매우 짜증나는 무언가를 만드는 것처럼 보입니다. –

답변

2

사용하려는 텍스트 상자에서 상속하고 여기에 기본값을 추가하십시오. 텍스트 상자 클래스 대신 클래스를 사용하십시오.

+0

이것은 현재 응용 프로그램에만 적용됩니다 – John

0

양식 및 컨텍스트 메뉴를 사용하여 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에이를 배치 제어.

1

당신은 add a Mouse Hook

해야하고 다음을 클릭하는 윈도우/컨트롤이 텍스트 상자 때 상황에 맞는 메뉴를 팝업 것입니다.

숨기거나 충돌하기 때문에 이미 존재하는 상황에 맞는 메뉴를 방해 할 수 있습니다.

(끔찍한 계획이지만 ...)

3

이것은 기술적으로 C#에서는 불가능합니다. 다음 상황을 상상해보십시오. 관리되는 확장을 성공적으로 작성하고 시스템의 텍스트 상자 컨텍스트 메뉴를 "확장"한다고 가정하십시오. 물론 추가 한 각 새 메뉴 항목을 처리해야합니다. 이를 달성하려면 텍스트 상자가 있고 각자 WindProc을 대체하는 각 프로세스에 관리 코드를 삽입해야합니다. 좋아, 귀하의 확장을 위해 사용하는 버전과 다른 .net 버전을 위해 작성된 시스템에 관리되는 응용 프로그램이 있다고 가정합니다. 따라서이 경우 확장 인젝션 중 심각한 오류가 발생합니다. 이는 프로세스 당 .net의 한 버전 만로드 될 수 있기 때문입니다. 따라서 강력한 관리 로우 레벨 훅 또는 셸 확장을 작성할 방법이 없습니다. here에서 :

낮은 수준의 후크와 WH_MOUSE_LL 낮은 수준의 후크, 당신은 글로벌 후크를 구현하지 수 WH_KEYBOARD_LL

글로벌 후크는 을 제외하고 .NET 프레임 워크
에서 지원되지 않습니다 Microsoft .NET Framework 전역 후크를 설치하려면 DLL 내보내기를 가져와 유효한 일치 함수를 호출해야하는 다른 프로세스에 자신을 삽입해야합니다. 이 동작에는 DLL 내보내기가 필요합니다. .NET Framework는 DLL 내보내기를 지원하지 않습니다. 관리되는 코드는 포인터에 대해 일관된 값의 포인터가 없으므로이 함수는 포인터는 동적으로 으로 작성된 프록시이기 때문입니다.

낮은 수준의 후크 절차는 후크를 설치 한 스레드에서 이라고합니다. 하위 수준의 후크는 DLL에 후크 절차를 구현할 필요가 없습니다 ( ).

this 문서를 확인하고 관리되는 셸 확장을 쓰지 않아도되는지 알아볼 수 있습니다.

+0

매우 재미있는 감사 – John

관련 문제