2008년 12월 30일 화요일

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);
}


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

사용자 삽입 이미지


댓글 6개:

  1. trackback from: 메모장2 + Context menu
    어느날 구차니님께서 말씀하셨다."메모장2는 다 좋은데 마우스메뉴 지원 안하는게 아쉽군요"필요는 발명의 어머니라고 했던가?결국 먼저 말을 꺼낸 구차니님께서 구차는 몸을 이끌고 기능 추가를 위한 몸부림을 시작하셨다ㅎㅎNotepad2 컴파일을 위한 몸부림 -1/2/3/4/5여기에 BLUEnLIVE님께서 협력하시어,notepad2 컴파일 삽질기 부록 : context-menu 추가깔끔하게 문맥메뉴를 지원하는 한글판 메모장2로 재탄생~~ 짜잔~~◈ 수정버...

    답글삭제
  2. 역시 장인의 손길이 느껴집니다^^

    답글삭제
  3. @okto - 2008/12/30 23:45
    뭐, 이번에도 구차니님께서 차려주신 밥상에 숟가락을... 쿨럭.

    답글삭제
  4. 트랙백 하나 잘못 갔네요ㅠㅠ

    답글삭제
  5. @okto - 2008/12/31 00:04
    지웠다능~

    답글삭제
  6. 이 넘의 산새교 OTL 오타가 집에서 저장이 되어 있더라구요.(파이어폭스)

    수고 하셨습니다~ ㅎㅎ 그럼 릴리즈는 okto님께 받으러 가면되는건가요? ㅋ

    답글삭제