Windows용 사용자 지정 셸 컨텍스트 처리기를 어떻게 만들 수 있나요?

StackOverflow https://stackoverflow.com/questions/117651

  •  02-07-2019
  •  | 
  •  

문제

문제

언어:C# 2.0 이상


사용자가 특정 파일(제 경우에는 *.eic)을 마우스 오른쪽 버튼으로 클릭할 때 메뉴를 생성하도록 컨텍스트 핸들러를 등록하고 싶습니다.이러한 메뉴에서 등록, 등록 취소(정리) 및 이벤트(클릭) 처리를 수행하는 절차는 무엇입니까?

Windows 레지스트리와 관련이 있다는 단서가 있지만 .net에 얼마나 많은 항목이 있는지 고려하면 이 작업을 깔끔하고 쉽게 수행할 수 있는 편리한 방법이 있더라도 놀라지 않을 것입니다.

코드 조각, 웹 사이트 참조, 설명은 모두 좋습니다.나에게 던져주세요.

업데이트


분명히 여러 사용자가 언급한 것처럼 관리되는 언어로 상황에 맞는 메뉴를 만드는 데 약간의 문제가 있습니다.동일한 동작을 수행하는 데 선호되는 다른 방법이 있습니까? 아니면 이러한 해결 방법을 조사하는 데 시간을 투자해야 합니까?나는 그렇게 하는 것을 전혀 신경 쓰지 않습니다. 사람들이 이것을 가능하게 하기 위해 노력한 것이 기쁘지만, 이것을 달성하는 "적절하고 깨끗한" 방법이 있는지 여전히 알고 싶습니다.

도움이 되었습니까?

해결책

관리되는 언어로 셸 확장을 작성하는 것을 거부하세요. 이 경로를 추구하면 큰 문제가 발생할 수 있는 일이 많이 있습니다.

자세한 내용은 이 스레드를 살펴보세요.여기에는 정말로 원할 경우 수행할 수 있는 링크와 수행할 수 있지만 수행해서는 안 되는 이유에 대한 현명한 조언이 포함되어 있습니다.

http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/1428326d-7950-42b4-ad94-8e962124043e/

여기서는 유일한 실제 도구인 관리되지 않는 C/C++로 돌아왔습니다.

다른 팁

서로 다른 버전의 .NET Framework 간에 종속성 문제가 발생할 수 있으므로 이는 좋은 생각이 아닙니다.셸 확장은 하나의 버전을 예상할 수 있지만 현재 실행 중인 애플리케이션에 의해 이미 다른 버전이 로드되었을 수 있습니다.

이 스레드 상황에 대한 좋은 요약이 포함되어 있습니다.

다른 사람들이 이미 순수 .NET에서 셸 확장을 작성하는 것은 프레임워크 충돌로 인해 좋지 않은 생각이라고 언급했지만 다음 사항에 유의해야 합니다.

  1. 관리되지 않는 쪽을 대신 수행하는 타사 드라이버(Eldos 또는 LogicNP 참조)가 있습니다. 이를 통해 기본 드라이버와 통신하는 관리 코드를 작성할 수 있으므로 셸 관련 CLR 버전 충돌을 방지할 수 있습니다.

  2. 최근 MSDN 기사에서는 Microsoft가 Silverlight에서 사용하는 CoreCLR에 대해 이 문제를 해결했다고 언급했습니다.이들은 여러 버전의 CLR이 동일한 프로세스에서 실행되도록 허용하여 문제를 해결함으로써 이를 달성했습니다.또한 저자는 Silverlight의 이 수정 사항이 전체 CLR의 향후 버전에 포함될 것이라고 밝혔습니다.(미래에는 관리 코드에서 셸 확장을 작성하는 것이 상당히 가능해질 것이라는 의미입니다.)

이전에 C#으로 수행한 적이 있습니다.결국에는 예상보다 훨씬 더 어려워집니다.하지만 상용구 코드를 작성하고 나면 새 항목을 출시하기가 쉽습니다.나는 이 링크를 따랐다:

정보 링크

이전 의견에서 언급했듯이 관리 언어로 셸 확장을 작성하는 것이 최선의 아이디어는 아니지만 바로 그 작업을 수행하는 오픈 소스 프로젝트를 공유하고 싶다고 생각했습니다. :)

쉘글루 실제로 매우 유용한 관리형 셸 확장입니다.C/C++로 셸 확장을 작성하는 데 관심이 있는 경우에도 이 소스가 도움이 될 수 있습니다.

관리 코드의 셸 확장 구현과 관련하여 언급된 주의 사항 외에도 기본적으로 수행해야 할 작업은 다음과 같습니다.

먼저 IShellExtInit IContextMenu 인터페이스를 구현하는 C#에서 COM 구성 요소를 만듭니다.C#에서 COM 구성 요소를 만드는 방법이 설명되어 있습니다. 여기.필요한 인터페이스를 구현하는 방법은 다음에 설명되어 있습니다. 이 기사.설명은 C++ 구현에 대한 것이지만 해당 지식을 C# 버전에 적용할 수 있습니다.

COM 구성 요소에는 Class-ID 또는 CLSID라는 GUID가 있습니다.상황에 맞는 메뉴 셸 확장으로 파일 형식에 해당 ID를 등록해야 합니다.

HKEY_CLASSES_ROOT\.eic\ShellEx\ContextMenuHandlers\MyShellExt
    (Default) -> {YOUR-COMPONENTS-CLSID}

또한 C# COM 자습서에 설명된 대로 구성 요소를 올바르게 등록했는지 확인하세요.아래의 레지스트리에서 찾아야 합니다.

HKEY_CLASSES_ROOT\CLSID\{YOUR-COMPONENTS-CLSID}
    InprocServer32
        (Default) -> C:\WINDOWS\system32\mscoree.dll
        Class -> YourImplClass
        assembly -> YourAssembly, version=..., Culture=neutral, PublicKey=...
        ...

행운을 빌어요...

다른 사람들이 지적했듯이 현재 Windows 개발에서는 쉘 확장이 실용적이지 않습니다.

최근에도 비슷한 질문을 했는데요 내가 하고 싶은 일을 정확하게 수행할 수 있는 가이드 링크가 포함된 답변을 받았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top