NSE 아이콘 오버레이 추가하는 방법
https://stackoverflow.com/questions/20975679/icon-overlay-handlers-for-namespace-extension
NSE에서 아이템에 대해 아이콘 오버레이를 추가하는 유일한 방법은 IShellIconOveray를 구현하는 것임. 해당 인터페이스의 GetOverlayIndex, GetOverlayIconIndex는 SHELL image list에서 받은 아이콘을 리턴해야 한다. SHGetIconOverlayIndex API를 통해서 얻어올 수 있다. SHELL image list에 추가 오버레이 아이콘을 추가할 방법은 없다.
표준 오버레이 아이콘을 사용하고자 한다면 SHGetIconOverlayIndex만을 사용하면 된다. 커스텀 오버레이 아이콘을 사용하고자 하면 단순 additional overlay shell extention을 사용해야 한다. overlay shell extention은 추가 오버레이 아이콘을 SHELL image list에 추가할 수 있다.
IShellIconOveralyIdentifier.GetOverlayInfo 1)에서 icon 과 인덱스를 리턴해야 한다. 해당 인터페이스의 IsMemberOf 2)는 항상 S_FALSE 리턴한다. 네가 구현하는 NSE에서 해당 인터페이스의 GetOverlayIndex 3)에서 네가 선호하는 아이콘과 인덱스로 SHGetIconOverlayIndex를 호출한다.
아래에서는 위에서 언급한 대로 IShellIconOverlayIdentifier를 구현했다.
https://stackoverflow.com/questions/31884145/custom-icon-overlays-for-namespace-extension?noredirect=1&lq=1
GetOveralyInfo()에서 icon 파일과 인덱스를 리턴한다.
IsMemberOf()에서 시스템의 다른 파일에 대한 오버레이를 표시하지 않기 위해 S_FALSE를 리턴한다. <- 내가 원하는 파일에 대해서만 오버레이를 표시할때만 S_OK 리턴
결과적으로
자신의 NSE내에서 IShellIconOverlay의 GetOverlayIndex()에서 SHGetIconOverlayIndex()를 사용해 리턴된 인덱스를 넘겨주기만 하면 된다.
그런데, 해당 API를 테스트해보면 다음과 같은 현상이 발생함.
SHGetIconOverlayIndex(NULL, IDO_SHGIOI_SHARE)에서 리턴된 overlay icon를 사용하면 동작이 되는데, SHGetIconOverlayIndex(myNseDllPath, 0)를 사용하면 항상 실패하고 -1을 리턴한다.
해결 :
SHGetIconOverlayIndex(myNseDllPath, iIndex) <- 빨간색 부분이myNseDllPath내의 리소스 섹션의 아이콘상의 zero-based 값을 넣어주면 성공한다.
QueryForOverlay라는 항목이 있는데 이게 뭐하는건지 모르겠음.
https://microsoft.public.platformsdk.shell.narkive.com/jO98Q3Ke/custom-icon-overlay-shell-namespace-extension
Have a look at
HKCR\CLSID\{450D8FBA-AD25-11D0-98A8-0800361B1103}. There's a key named
"ShellFolder" and inside this key there's an empty REG_SZ value called
"QueryForOverlay". Maybe you need to add this value for your NSE to make
it work.
I found the following description for this value: "If this property is
True then Windows Shell will query your extension about overlay icon for
the root folder of the namespace extension."
NSE에서 아이템에 대해 아이콘 오버레이를 추가하는 유일한 방법은 IShellIconOveray를 구현하는 것임. 해당 인터페이스의 GetOverlayIndex, GetOverlayIconIndex는 SHELL image list에서 받은 아이콘을 리턴해야 한다. SHGetIconOverlayIndex API를 통해서 얻어올 수 있다. SHELL image list에 추가 오버레이 아이콘을 추가할 방법은 없다.
표준 오버레이 아이콘을 사용하고자 한다면 SHGetIconOverlayIndex만을 사용하면 된다. 커스텀 오버레이 아이콘을 사용하고자 하면 단순 additional overlay shell extention을 사용해야 한다. overlay shell extention은 추가 오버레이 아이콘을 SHELL image list에 추가할 수 있다.
IShellIconOveralyIdentifier.GetOverlayInfo 1)에서 icon 과 인덱스를 리턴해야 한다. 해당 인터페이스의 IsMemberOf 2)는 항상 S_FALSE 리턴한다. 네가 구현하는 NSE에서 해당 인터페이스의 GetOverlayIndex 3)에서 네가 선호하는 아이콘과 인덱스로 SHGetIconOverlayIndex를 호출한다.
아래에서는 위에서 언급한 대로 IShellIconOverlayIdentifier를 구현했다.
https://stackoverflow.com/questions/31884145/custom-icon-overlays-for-namespace-extension?noredirect=1&lq=1
GetOveralyInfo()에서 icon 파일과 인덱스를 리턴한다.
IsMemberOf()에서 시스템의 다른 파일에 대한 오버레이를 표시하지 않기 위해 S_FALSE를 리턴한다. <- 내가 원하는 파일에 대해서만 오버레이를 표시할때만 S_OK 리턴
결과적으로
자신의 NSE내에서 IShellIconOverlay의 GetOverlayIndex()에서 SHGetIconOverlayIndex()를 사용해 리턴된 인덱스를 넘겨주기만 하면 된다.
그런데, 해당 API를 테스트해보면 다음과 같은 현상이 발생함.
SHGetIconOverlayIndex(NULL, IDO_SHGIOI_SHARE)에서 리턴된 overlay icon를 사용하면 동작이 되는데, SHGetIconOverlayIndex(myNseDllPath, 0)를 사용하면 항상 실패하고 -1을 리턴한다.
해결 :
SHGetIconOverlayIndex(myNseDllPath, iIndex) <- 빨간색 부분이myNseDllPath내의 리소스 섹션의 아이콘상의 zero-based 값을 넣어주면 성공한다.
QueryForOverlay라는 항목이 있는데 이게 뭐하는건지 모르겠음.
https://microsoft.public.platformsdk.shell.narkive.com/jO98Q3Ke/custom-icon-overlay-shell-namespace-extension
Have a look at
HKCR\CLSID\{450D8FBA-AD25-11D0-98A8-0800361B1103}. There's a key named
"ShellFolder" and inside this key there's an empty REG_SZ value called
"QueryForOverlay". Maybe you need to add this value for your NSE to make
it work.
I found the following description for this value: "If this property is
True then Windows Shell will query your extension about overlay icon for
the root folder of the namespace extension."
댓글
댓글 쓰기