관리 메뉴

kisoo

WINDOW EXPLORER 레지스트리 변경 후 실시간으로 탐색기에 반영 하기 (windows explorer refresh) 본문

01.About Programming /9..VC++

WINDOW EXPLORER 레지스트리 변경 후 실시간으로 탐색기에 반영 하기 (windows explorer refresh)

JamesK78 2009. 9. 9. 13:46
내가 구현 하려던 기능은 탐색기에 나타나는 볼륨을 HIDE 시키고  HIDE 된 볼륨을 다시 보이게 하는 기능 이었다.
문제는 레지스트리 값을 변경 해도 그것이 실시간으로 윈도우에 반영이 안되었던 부분 이었다.
오늘은 volume 을 HIDE/SHOW 하는 부분에 대해서 설명 하도록 해 보겠다.
회사 에어컨이 빵빵해서 콧물이 나오는 구만 ㅡ,ㅡ

볼륨을 hide 시키는 방법

key : HKLU\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\POLICIES\EXPLORER
data key : NoDrives
data value : type DWORD or BINARY
아래는 각 드라이브 에 대한 NoDrives 값이다.
숨기려고 하는 볼륨을 값을 NoDrives 에 써주면 된다. 물론 멀티 드라이브를 HIDE 시키고 싶으면 
계산을  해주면 된다. 
또 한가지 중요 한 부분은 위의 KEY 가 HKLM 에도 존재 한다는 것이다.
만약 HKLM 에 적용 하게 되면 모든 사용자에 적용이 된다. 따라서 HKLU 에 적용해도 HKLM 에
적용한 값이 먼저 적용이 되므로 HKLU 에 적용 된 것은 무효가 된다.
고로 HKLU 에 적용 하도록 해야 한다.

msdn url : http://technet.microsoft.com/en-us/library/cc938267.aspx
 
      voulume            data value
A              1 00 00 00
B              2 00 00 00
C              4 00 00 00
D              8 00 00 00
E              16 00 00 00
              2 00 00 00
G              64 00 00 00
H             128 00 00 00
I               00 1 00 00
J              00 2 00 00
K              00 4 00 00
L              00 8 00 00
M             00 16 00 00
N              00 32 00 00
O              00 64 00 00
P              00 128 00 00
Q              00 00 1 00
R              00 00 2 00
S              00 00 4 00
T              00 00 8 00
U              00 00 16 00
V              00 00 32 00
W             00 00 64 00
X              00 00 128 00
Y              00 00 00 1
Z              00 00 00 2


그러나 중요한 사항은 레지스트리에 NoDrives 값을 셋팅 한 후이다.
볼륨을 숨기고 보이게 할 때 마다 재부팅을 하거나 explorer.exe 를 재실행 할 수는 없는 노릇이다.
(ㅡㅡ; 나도 처음엔 explorer.exe 를 kill 한 후 재실행 했었다. ㅡㅡ;;;)

탐색기를 일일이 찾아서 REFRESH? F5 키를 눌러도 적용이 안된다.

우리는 windows API 가 제공하는 기능을 잘 활용 하면 된다.
처음엔 WINDOW SETTION 값이 변경 되었다는 것을 WINDOW SYSTEM 에 BROADCAST 로 알려 준다. 

윈도우 시스템 SETTING 값 변경 MESSAGE
 
DWORD dwResult = 0;
SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,0,0,SMTO_ABORTIFHUNG,100,&dwResult);

또는 ,

::SendMessage( HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0 );

를 사용 해도 된다. 



그럼 다음 무엇을 해야 하나?? 난 처음에 이렇게 하면 끝인 줄 알았다. 
하지만 탐색기나 WINDOW 에 바뀐 부분을 갱신을 시켜 줘야 했다. 

탐색기 갱신 하기
 
            SHChangeNotify(SHCNE_DRIVEREMOVED, SHCNF_PATH, strLetter,NULL);


여기서 strLetter 값은 "d:\\" 와 같이 볼륨 string 이다.
주의 할 사항은 ":\\" 를 꼭 붙혀줘야 한다.

자 이제 확인해 보자. 
탐색기를 띄어 놓고 해봐도 hide/show 가 실시간으로 된다. 

몇시간 삽질 하고 느낀점은
느낀점이 있다면 windows API 를 잘 활용 하자는 것이다. ㅡㅡ 
WINDOW API 는 우리가 생각하는 것들을 쉽게 잘 만들어 두었다. 

나처럼 삽질 하지 않길 바라며 개발자 들이여 WINDOW API 를 잘 찾아보자.



  
Comments