2014-02-09 4 views
3

TaskDialog 메시지 상자에 보안 성공 아이콘 (파란색 배경)을 표시하려고합니다. 이것은 TaskDialogStandardIcon의 enum 값 중 하나가 아닙니다. 참조 : http://dotnet.dzone.com/articles/using-new-taskdialog-winapi.Taskdialog의 숨겨진 보안 아이콘 사용

어떻게 이러한 비표준 값을 ((TaskDialog) 보낸 사람)에게 할당합니까? C#에서도 가능합니까? C#

모든 포인터가 정말 도움이 될 것입니다.

안부, 애쉬 윈

답변

3

난 당신이 comctl32.dll에서 자신을 TaskDialog 기능을 가져와야합니다 생각 :

static class TaskDialogWrapper 
{ 
    [DllImport("comctl32.dll", CharSet = CharSet.Unicode, EntryPoint = "TaskDialog")] 
    static extern int TaskDialog(IntPtr hWnd, IntPtr hInstance, string pszWindowTitle, string pszMainInstruction, string pszContent, TaskDialogCommonButton dwCommonButtons, IntPtr pszIcon, out IntPtr pnButton); 

    public static TaskDialogCommonButton Show(IntPtr handle, IntPtr instance, string title, string instructionText, string content, TaskDialogCommonButton commonButtons, TaskDialogCommonIcon commonIcon) 
    { 
     IntPtr resultButton; 
     if (TaskDialog(handle, instance, title, instructionText, content, commonButtons, new IntPtr((int)commonIcon), out resultButton) != 0) 
      throw new InvalidOperationException(); 
     return (TaskDialogCommonButton)resultButton; 
    } 
} 

[Flags()] 
enum TaskDialogCommonButton 
{ 
    Ok = 0x1, 
    Yes = 0x2, 
    No = 0x4, 
    Cancel = 0x8, 
    Retry = 0x10, 
    Close = 0x20 
} 

enum TaskDialogCommonIcon 
{ 
    ShieldGrey = 65527, 
    ShieldOk = 65528, 
    ShieldError = 65529, 
    ShieldWarning = 65530, 
    ShieldBlue = 65531, 
    Shield = 65532, 
    Information = 65533, 
    Error = 65534, 
    Warning = 65535, 
} 

파일에서 자신의 아이콘을 사용하려면 TaskDialogIndirect을 가져와야합니다. .


가 (, BTW 내가 TaskDialogCommonIcon 많은 다른 흥미로운 아이콘 스타일을 발견 당신은 예를 추가 할 수 있습니다.

enum TaskDialogCommonIcon 
{ 
    None = 0, 
    Sheet = 2, 
    ExplorerFolderOpen = 3, 
    ExplorerFolderFlat = 5, 
    ExplorerFolderLeft = 6, 
    Search = 8, 
    ExplorerFolderClosed = 10, 
    ExplorerGames = 14, 
    Application = 15, 
    TransparentSpace = 17, 
    ExplorerSearch = 18, 
    TextFile = 19, 
    Letter = 20, 
    Picture = 21, 
    Diashow = 103, 
    // ... 
} 
+1

나는 조금 더 오래되었지만 ("BTW"섹션에서)이 특정 열거 형은 어디에서 찾았습니까? 수동으로 식별 할 필요없이 어딘가에서 전체 목록을 찾을 수 있는지 알고 싶습니다. Nuget (https://www.nuget.org/packages/WindowsAPICodePack-Core/)의 WindowsAPICodePack을 사용하여 Icon 속성을 캐스팅 된 값으로 설정하여 호출 할 수 있음을 알았습니다 ('CType (65528, TaskDialogCommonIcon)'), 가능한 한 전체 목록을 얻으려고합니다. –

+1

실망 시키는게 두렵습니다. 그러나이 상수를 발견 한 방법은 모두 그들을 시험해 보았습니다. 그럼에도 불구하고 동일한 순서로 같은 아이콘을 저장하는 DLL이 존재할 수 있습니다 (예 : imageres? 나도 몰라요.). 아이콘의 공식적인 의미를 알아 내기 위해 google을 사용할 수 있습니다. – KnorxThieus

2

나는이 오래된 질문이다 것을 알고,하지만 난 비슷한 뭔가를 찾고 있었다, @KnorxThieus가 게시 한 정보를 사용하여 위에서 설명한 DLLImport 프로세스를 거치지 않고 TaskDialog에서 "숨겨진"보안 아이콘을 사용하는 방법을 발견했습니다. 실제 값을 사용하여 그는 TaskDialogCommonIcon 열거 형을 제공 했으므로 해당 유형 (예 :)으로 간단하게 캐스팅 할 수 있음을 발견했습니다.) 응용 프로그램에 올바르게 표시되어야합니다.

Nuget (nuget.org/packages/WindowsAPICodePack-Core)에서 WindowsAPICodePack 버전 1.1.2를 사용하고 있으며 아래 코드가 Telerik 코드 변환기 (http://converter.telerik.com/)를 사용하여 Visual Basic에서 변환되었습니다. 그래서 당신이 C#으로 약간의 미세 조정을 할 수 있습니다 가능성이 있습니다 : 내 테스트에서

if (TaskDialog.IsPlatformSupported) { 
    using (TaskDialog dialog = new TaskDialog()) { 
     dialog.Caption = "TESTING"; 
     dialog.InstructionText = "THIS IS A TEST"; 
     dialog.Text = "This is a test of casting a value to the desired Icon type for a TaskDialog."; 

     // Produces the green shield with green background 
     dialog.Icon = (TaskDialogStandardIcon)65528; 
     dialog.OwnerWindowHandle = this.Handle; 
     dialog.Show(); 
    } 
} 

, 이것은 열거 된 목록에 @KnorxThieus뿐만 아니라 몇몇 다른 사람 모두를 위해 작동하는 것 같다. 나는 다른 (비표준) 이미지 파일에 Icon 속성을 설정하는 비슷한 방법이 있는지 알아 내려고하고 있지만 지금까지는 실패했습니다. 나는 이것이 이것이 미래를 가로막는 모든 사람들을 돕기를 바랍니다.