그런데, 수정 이후에 두 가지 내용을 수정하게되어 수정내용을 포스팅합니다.
수정된 내용은 아래와 같습니다.
흔쾌히 코드를 수정해주신 구차니님께 감사드립니다.
- 레지스트리 키 이름이 바로 메뉴에 뜨지 않고 별도의 문자열이 뜨도록 수정
- 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)에서 아래 내용을 찾습니다.
다음으로, LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam)에서 아래 내용을 찾습니다. (notepad2 컴파일 삽질기 부록 : context-menu 추가에서 수정한 부분입니다)
다음은 LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) 함수를 수정합니다.
아래 내용을 찾아 삭제합니다. (이 부분 역시 notepad2 컴파일 삽질기 부록 : context-menu 추가에서 수정한 곳입니다)
다음으로 void LoadSettings() 함수를 수정합니다.
아래 내용을 찾아 삭제합니다.(이 부분도 notepad2 컴파일 삽질기 부록 : context-menu 추가에서 수정한 곳입니다)
다음으로 void SaveSettings(BOOL bSaveSettingsNow) 함수를 수정합니다.
아래 내용을 찾아 삭제합니다.(이 부분도 notepad2 컴파일 삽질기 부록 : context-menu 추가에서 수정한 곳입니다)
마지막으로 함수를 하나 추가합니다.
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 ¬epad2";
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 ¬epad2";
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);
}
수정된 결과는 아래와 같습니다.
(한글화를 위해 메뉴 내용을 한글로 수정했습니다)
trackback from: 메모장2 + Context menu
답글삭제어느날 구차니님께서 말씀하셨다."메모장2는 다 좋은데 마우스메뉴 지원 안하는게 아쉽군요"필요는 발명의 어머니라고 했던가?결국 먼저 말을 꺼낸 구차니님께서 구차는 몸을 이끌고 기능 추가를 위한 몸부림을 시작하셨다ㅎㅎNotepad2 컴파일을 위한 몸부림 -1/2/3/4/5여기에 BLUEnLIVE님께서 협력하시어,notepad2 컴파일 삽질기 부록 : context-menu 추가깔끔하게 문맥메뉴를 지원하는 한글판 메모장2로 재탄생~~ 짜잔~~◈ 수정버...
역시 장인의 손길이 느껴집니다^^
답글삭제@okto - 2008/12/30 23:45
답글삭제뭐, 이번에도 구차니님께서 차려주신 밥상에 숟가락을... 쿨럭.
트랙백 하나 잘못 갔네요ㅠㅠ
답글삭제@okto - 2008/12/31 00:04
답글삭제지웠다능~
이 넘의 산새교 OTL 오타가 집에서 저장이 되어 있더라구요.(파이어폭스)
답글삭제수고 하셨습니다~ ㅎㅎ 그럼 릴리즈는 okto님께 받으러 가면되는건가요? ㅋ