notepad2 컴파일 삽질기 부록#2 : context-menu 추가 업그레이드

구차니님께서 context-menu기능을 수정하신 내용을 notepad2 컴파일 삽질기 부록: context-menu 추가에 포스팅했습니다.
그런데, 수정 이후에 두 가지 내용을 수정하게되어 수정내용을 포스팅합니다.
수정된 내용은 아래와 같습니다.

흔쾌히 코드를 수정해주신 구차니님께 감사드립니다.

  1. 레지스트리 키 이름이 바로 메뉴에 뜨지 않고 별도의 문자열이 뜨도록 수정
  2. context-menu 등록여부를 ini파일이 아니라 레지스트리에서 직접 확인

코드를 수정하는 절차는 아래와 같습니다.
수정 대상 파일은 Notepad2.h, Notepad2.c 두 개입니다.

반드시 notepad2 컴파일 삽질기 부록 : context-menu 추가대로 수정한 후에 수정해야합니다.


1. Notepad2.h

새로운 함수 하나를 추가합니다.
void CheckRegistry();



2. Notepad2.c

LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)에서 아래 내용을 찾습니다.
case WM_COMMAND:
  return MsgCommand(hwnd,wParam,lParam);
여기에 아래와 같이 한 줄을 추가합니다.
case WM_COMMAND:
  CheckRegistry();
  return MsgCommand(hwnd,wParam,lParam);



다음으로, LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam)에서 아래 내용을 찾습니다. (notepad2 컴파일 삽질기 부록 : context-menu 추가에서 수정한 부분입니다)
case IDM_REGISTRY_ALL:
// Register registry - type unknown
if (bRegistryAllType)
{
  //WinNT requires the key to have no subkeys
  RegDeleteKey(HKEY_CLASSES_ROOT, L"*\\shell\\Open with notepad2\\command");
  RegDeleteKey(HKEY_CLASSES_ROOT, L"*\\shell\\Open with notepad2");
}
else
{
  HKEY key1;
  LONG res = RegCreateKey(HKEY_CLASSES_ROOT,
      L"*\\shell\\Open with notepad2\\command",
      &key1);
  if (res == ERROR_SUCCESS)
  {
      WCHAR cmd[MAX_PATH + 4];
      WCHAR path[MAX_PATH];
      int len;
      GetModuleFileName(GetModuleHandle(NULL), path, MAX_PATH);
      len = wsprintf(cmd, L"%s %%1", path);
      RegSetValue(key1, NULL, REG_SZ, cmd, len);
  }
}       
bRegistryAllType = (bRegistryAllType) ? FALSE : TRUE;
break;

case IDM_REGISTRY_UNKNOWN:
// Register registry - type all
if (bRegistryUnknownType)
{
  //WinNT requires the key to have no subkeys
  RegDeleteKey(HKEY_CLASSES_ROOT, L"Unknown\\shell\\Open with notepad2\\command");
  RegDeleteKey(HKEY_CLASSES_ROOT, L"Unknown\\shell\\Open with notepad2");
}
else
{
  HKEY key1;
  LONG res = RegCreateKey(HKEY_CLASSES_ROOT,
      L"Unknown\\shell\\Open with notepad2\\command",
      &key1);
  if (res == ERROR_SUCCESS)
  {
      WCHAR cmd[MAX_PATH + 4];
      WCHAR path[MAX_PATH];
      int len;
      GetModuleFileName(GetModuleHandle(NULL), path, MAX_PATH);
      len = wsprintf(cmd, L"%s %%1", path);
      RegSetValue(key1, NULL, REG_SZ, cmd, len);
  }
}
bRegistryUnknownType = (bRegistryUnknownType) ? FALSE : TRUE;
break;
이 내용을 아래와 같이 수정합니다.
case IDM_REGISTRY_ALL:
// Register registry - type unknown
if (bRegistryAllType)
{
  //WinNT requires the key to have no subkeys
  RegDeleteKey(HKEY_CLASSES_ROOT, L"*\\shell\\Open with notepad2\\command");
  RegDeleteKey(HKEY_CLASSES_ROOT, L"*\\shell\\Open with notepad2");
}
else
{
  HKEY key1;
    LONG res = RegCreateKey(HKEY_CLASSES_ROOT,L"*\\shell\\Open with notepad2",&key1);
  if (res == ERROR_SUCCESS)
    {
    WCHAR cmd[] = L"Open with &notepad2";
    RegSetValue(key1, NULL, REG_SZ, cmd, wcslen(cmd));
  }
    RegCloseKey(key1);

  res = RegCreateKey(HKEY_CLASSES_ROOT,L"*\\shell\\Open with notepad2\\command",&key1);
  if (res == ERROR_SUCCESS)
  {
    WCHAR cmd[MAX_PATH + 4];
      WCHAR path[MAX_PATH];
        int len;
        GetModuleFileName(GetModuleHandle(NULL), path, MAX_PATH);
    len = wsprintf(cmd, L"%s %%1", path);
    RegSetValue(key1, NULL, REG_SZ, cmd, len);
  }
    RegCloseKey(key1);
}       
bRegistryAllType = (bRegistryAllType) ? FALSE : TRUE;
break;

case IDM_REGISTRY_UNKNOWN:
// Register registry - type all
if (bRegistryUnknownType)
{
  //WinNT requires the key to have no subkeys
  RegDeleteKey(HKEY_CLASSES_ROOT, L"Unknown\\shell\\Open with notepad2\\command");
  RegDeleteKey(HKEY_CLASSES_ROOT, L"Unknown\\shell\\Open with notepad2");
}
else
{
  HKEY key1;
    LONG res = RegCreateKey(HKEY_CLASSES_ROOT,L"Unknown\\shell\\Open with notepad2",&key1);
  if (res == ERROR_SUCCESS)
  {
    WCHAR cmd[] = L"Open with &notepad2";
    RegSetValue(key1, NULL, REG_SZ, cmd, wcslen(cmd));
  }
  RegCloseKey(key1);

  res = RegCreateKey(HKEY_CLASSES_ROOT,L"Unknown\\shell\\Open with notepad2\\command",&key1);
  if (res == ERROR_SUCCESS)
  {
    WCHAR cmd[MAX_PATH + 4];
        WCHAR path[MAX_PATH];
        int len;
        GetModuleFileName(GetModuleHandle(NULL), path, MAX_PATH);
    len = wsprintf(cmd, L"%s %%1", path);
    RegSetValue(key1, NULL, REG_SZ, cmd, len);
  }
    RegCloseKey(key1);
}
bRegistryUnknownType = (bRegistryUnknownType) ? FALSE : TRUE;
break;



다음은 LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) 함수를 수정합니다.
아래 내용을 찾아 삭제합니다. (이 부분 역시 notepad2 컴파일 삽질기 부록 : context-menu 추가에서 수정한 곳입니다)
case IDM_REGISTRY_UNKNOWN:
// Register registry - type unknown
break;

case IDM_REGISTRY_ALL:
// Register registry - type all
break;



다음으로 void LoadSettings() 함수를 수정합니다.
아래 내용을 찾아 삭제합니다.(이 부분도 notepad2 컴파일 삽질기 부록 : context-menu 추가에서 수정한 곳입니다)
bRegistryUnknownType = IniSectionGetInt(pIniSection,L"RegistryUnknownType",0);
if (bRegistryUnknownType) bRegistryUnknownType = 1;

bRegistryAllType = IniSectionGetInt(pIniSection,L"RegistryAllType",0);
if (bRegistryAllType) bRegistryAllType = 1;



다음으로 void SaveSettings(BOOL bSaveSettingsNow) 함수를 수정합니다.
아래 내용을 찾아 삭제합니다.(이 부분도 notepad2 컴파일 삽질기 부록 : context-menu 추가에서 수정한 곳입니다)
IniSectionSetInt(pIniSection,L"RegistryUnknownType",bRegistryUnknownType);
IniSectionSetInt(pIniSection,L"RegistryAllType",bRegistryAllType);



마지막으로 함수를 하나 추가합니다.
void CheckRegistry()
{
    HKEY key;
    LONG res;

    res = RegOpenKey(HKEY_CLASSES_ROOT,L"*\\shell\\Open with notepad2",&key);
    if(res == ERROR_SUCCESS)
            bRegistryAllType = TRUE;
    else    bRegistryAllType = FALSE;
    RegCloseKey(key);

    res = RegOpenKey(HKEY_CLASSES_ROOT,L"unknown\\shell\\Open with notepad2",&key);
    if(res == ERROR_SUCCESS)
            bRegistryUnknownType = TRUE;
    else    bRegistryUnknownType = FALSE;
    RegCloseKey(key);
}


수정된 결과는 아래와 같습니다.
(한글화를 위해 메뉴 내용을 한글로 수정했습니다)

사용자 삽입 이미지