2010-03-19 4 views
0

Windows 탐색기에 대한 셸 상황에 맞는 메뉴를 구현하고 메뉴를 성공적으로 만들었습니다. 내가 겪고있는 문제는 선택한 메뉴 항목 위로 마우스를 가져 가면 상태 표시 줄에 도움말 텍스트를 표시하는 IContextMenu :: GetCommandString 메서드입니다. ..IContextMenu :: GetCommandString Windows 탐색기에서 도움말 텍스트를 표시하지 않습니다.

자신의 도움말 텍스트가 쓰레기로 바뀌 개방, 또는 인쇄 있었다 -

내가 각 항목에 아무것도 위로 마우스를 가져 않는

가 표시하지만, 무슨 이상한 것은 내가, 예를 들면 만들 didnt가 다른 항목의 일부이다됩니다 다음의 IContextMenu :: QueryContextMenu 상황 &의 IContextMenu ::하여 GetCommandString의 코드 샘플은

int ShellExtLib.IContextMenu.QueryContextMenu(IntPtr hMenu, uint indexMenu, uint idCmdFirst, uint idCmdLast, uint uFlags) 
{ 
    uint idCmd = idCmdFirst; 
    StringBuilder sb = new StringBuilder(1024); 

    try 
    { 
     if ((uFlags & 0xf) == 0 || (uFlags & (uint)ShellExtLib.CMF.CMF_EXPLORE) != 0) 
     { 
      uint selectedFileCount = Helpers.DragQueryFile(m_hDrop, 0xffffffff, null, 0); 

      if (selectedFileCount == 1) 
      { 
       Helpers.DragQueryFile(m_hDrop, 0, sb, sb.Capacity + 1); 
       Documents.Add(sb.ToString()); 
      } 
      else 
      { 
       // MULTIPLE FILES SELECTED. 
       for (uint i = 0; i < selectedFileCount; i++) 
       { 
        Helpers.DragQueryFile(m_hDrop, i, sb, sb.Capacity + 1); 
        Documents.Add(sb.ToString()); 
       } 
      } 

      Helpers.InsertMenu(hMenu, indexMenu++, ShellExtLib.UFLAGS.MF_SEPARATOR | ShellExtLib.UFLAGS.MF_BYPOSITION, 0, null); 

      IntPtr hSubMenu = Helpers.CreateMenu(); 
      if (hSubMenu != IntPtr.Zero) 
      { 
       Helpers.InsertMenu(hSubMenu, 0, ShellExtLib.UFLAGS.MF_STRING | ShellExtLib.UFLAGS.MF_BYPOSITION, idCmd++, "Item 1"); 
       Helpers.InsertMenu(hSubMenu, 1, ShellExtLib.UFLAGS.MF_STRING | ShellExtLib.UFLAGS.MF_BYPOSITION, idCmd++, "Item 2"); 
       Helpers.InsertMenu(hSubMenu, 2, ShellExtLib.UFLAGS.MF_SEPARATOR | ShellExtLib.UFLAGS.MF_BYPOSITION, idCmd++, null); 
       Helpers.InsertMenu(hSubMenu, 3, ShellExtLib.UFLAGS.MF_STRING | ShellExtLib.UFLAGS.MF_BYPOSITION, idCmd++, "Item 3"); 
       Helpers.InsertMenu(hSubMenu, 4, ShellExtLib.UFLAGS.MF_SEPARATOR | ShellExtLib.UFLAGS.MF_BYPOSITION, idCmd++, null); 
       Helpers.InsertMenu(hSubMenu, 5, ShellExtLib.UFLAGS.MF_STRING | ShellExtLib.UFLAGS.MF_BYPOSITION, idCmd++, "Item 4"); 
       Helpers.InsertMenu(hSubMenu, 6, ShellExtLib.UFLAGS.MF_STRING | ShellExtLib.UFLAGS.MF_BYPOSITION, idCmd++, "Item 5"); 
      } 

      Helpers.InsertMenu(hMenu, indexMenu++, ShellExtLib.UFLAGS.MF_STRING | ShellExtLib.UFLAGS.MF_BYPOSITION | ShellExtLib.UFLAGS.MF_POPUP, (uint)hSubMenu, "Main Menu"); 

      Helpers.InsertMenu(hMenu, indexMenu++, ShellExtLib.UFLAGS.MF_SEPARATOR | ShellExtLib.UFLAGS.MF_BYPOSITION, 0, null); 

      return (int)(idCmd - idCmdFirst); 
     } 
    } 
    catch { } 

    return 0; 
} 



void ShellExtLib.IContextMenu.GetCommandString(int idCmd, uint uFlags, int pwReserved, StringBuilder commandString, int cchMax) 
    { 
     switch (uFlags) 
     { 
      case (uint)ShellExtLib.GCS.VERB: 
       commandString = new StringBuilder("x"); 
       break; 

      case (uint)ShellExtLib.GCS.HELPTEXTA: 
       commandString = new StringBuilder("y"); 
       break; 
     } 
    } 

사람이 어떤 제안이 있습니까 ..입니까? 필자는 셸 확장을 작성하는 방법에 대한 기사를 읽었으며 MSDN도 읽었습니다.

감사합니다.

+0

.NET에서 셸 확장을 만들지 않아야합니다. – Anders

+0

안녕하세요? 랩 인터페이스를 게시 했습니까? – divinci

답변

1

GetCommandString의 선언이 잘못되었습니다. GetCommandString은 문자열을 복사해야하는 곳에서 자체 버퍼를 전달합니다. 이 경우 StringBuilder로 선언 할 수 있다고 생각하지 않습니다. IntPtr로 선언 한 다음 Encoding.Unicode.GetBytes 및 Marshal.Copy를 사용하여 문자열을 버퍼에 복사합니다. Null 종결자를 추가해야합니다.

0

정확하려면 GetCommandString flags도 확인해야합니다. pszName이 LPSTR로 선언 되더라도 GCS _... 상수가 A (ansi) 또는 W (유니 코드)인지 확인하십시오.
예를 들어 uFlags가 GCS_VERBA 인 경우 pszName은 LPSTR (char *)이며 ANSI 문자열에서 cch 문자를 복사해야합니다.
uFlags가 GCS_VERBW 인 경우 pszName은 LPSTR로 선언 된 경우에도 LPWSTR 유형 (wchar_t *)이며 유니 코드 문자열에서 cch 문자를 복사해야합니다.
cchMax에 대한 설명서가 올바른지 기억이 안납니다 (바이트 수 및 문자 수 제외).

관련 문제