上次的VB.net调用TaskDialog已经自己弄好了,但是现在有个TaskDialogIndirect是真的不会,弄了半天总是显示“
System.ArgumentNullException:“值不能为 null。
Arg_ParamName_Name”
”,麻烦懂行的高人指点一下,感激不尽(如果有需要,我可以提供源代码以及错误信息)
有关任务对话框(TaskDialogIndirect),参见
https://learn.microsoft.com/zh-cn/windows/win32/api/commctrl/nf-commctrl-taskdialogindirect
函数原型有没有错
<DllImport("comctl32.dll", ExactSpelling:=True, CharSet:=CharSet.Unicode)>
Private Shared Function TaskDialogIndirect(
ByRef pTaskConfig As TASKDIALOGCONFIG,
ByRef pnButton As Integer,
ByRef pnRadioButton As Integer,
<MarshalAs(UnmanagedType.Bool)> ByRef pfverificationFlagChecked As Boolean
) As UInteger
End Function
参考下 https://www.pinvoke.net/default.aspx/comctl32.taskdialogindirect
是否有可以重现问题的最小示例代码?你也可以尝试查参考这里的解决方案对你是否有帮助,其中有链接提到了vb中的用法。
Imports System.Runtime.InteropServices
Public Class Form2
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure TASKDIALOGCONFIG
Public cbSize As UInteger
Public hwndParent As IntPtr
Public hInstance As IntPtr
Public dwFlags As TASKDIALOG_FLAGS
Public dwCommonButtons As TASKDIALOG_COMMON_BUTTON_FLAGS
Public pszWindowTitle As String
Public dwMainIcon As IntPtr
Public pszMainInstruction As String
Public pszContent As String
Public cButtons As UInteger
Public pButtons As IntPtr
Public nDefaultButton As Integer
Public cRadioButtons As UInteger
Public pRadioButtons As IntPtr
Public nDefaultRadioButton As Integer
Public pszVerificationText As String
Public pszExpandedInformation As String
Public pszExpandedControlText As String
Public pszCollapsedControlText As String
Public dwFooterIcon As IntPtr
Public pszFooter As String
Public pCallback As IntPtr
Public lpCallbackData As IntPtr
Public cxWidth As UInteger
End Structure
<Flags>
Public Enum TASKDIALOG_FLAGS
TDF_ENABLE_HYPERLINKS = &H1
TDF_USE_HICON_MAIN = &H2
TDF_USE_HICON_FOOTER = &H4
TDF_ALLOW_DIALOG_CANCELLATION = &H8
TDF_USE_COMMAND_LINKS = &H10
TDF_USE_COMMAND_LINKS_NO_ICON = &H20
TDF_EXPAND_FOOTER_AREA = &H40
TDF_EXPANDED_BY_DEFAULT = &H80
TDF_VERIFICATION_FLAG_CHECKED = &H100
TDF_SHOW_PROGRESS_BAR = &H200
TDF_SHOW_MARQUEE_PROGRESS_BAR = &H400
TDF_CALLBACK_TIMER = &H800
TDF_POSITION_RELATIVE_TO_WINDOW = &H1000
TDF_RTL_LAYOUT = &H2000
TDF_NO_DEFAULT_RADIO_BUTTON = &H4000
TDF_CAN_BE_MINIMIZED = &H8000
TDF_SIZE_TO_CONTENT = &H10000
TDF_ICON_MAIN = &H20000
TDF_ICON_FOOTER = &H40000
TDF_USER_PREFERENCE = &H40000
TDF_NO_SET_FOREGROUND = &H80000
TDF_REVERSE_BUTTON_ORDER = &H100000
End Enum
<Flags>
Public Enum TASKDIALOG_COMMON_BUTTON_FLAGS
TDCBF_OK_BUTTON = &H1
TDCBF_YES_BUTTON = &H2
TDCBF_NO_BUTTON = &H4
TDCBF_CANCEL_BUTTON = &H8
TDCBF_RETRY_BUTTON = &H10
TDCBF_CLOSE_BUTTON = &H20
End Enum
Public Delegate Function TaskDialogCallback(ByVal hwnd As IntPtr, ByVal msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr, ByVal lpRefData As IntPtr) As Integer
<DllImport("Comctl32.dll", CharSet:=CharSet.Unicode, PreserveSig:=False)>
Public Shared Function TaskDialogIndirect(ByVal pTaskConfig As IntPtr, ByRef pnButton As Integer, ByRef pnRadioButton As Integer, ByRef pfVerificationFlagChecked As Boolean) As Integer
End Function
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim config As New TASKDIALOGCONFIG()
config.cbSize = CUInt(Marshal.SizeOf(config))
config.hwndParent = Me.Handle ' 设置父窗口句柄
config.hInstance = IntPtr.Zero ' 设置实例句柄
config.dwFlags = TASKDIALOG_FLAGS.TDF_ENABLE_HYPERLINKS Or TASKDIALOG_FLAGS.TDF_ALLOW_DIALOG_CANCELLATION
config.dwCommonButtons = TASKDIALOG_COMMON_BUTTON_FLAGS.TDCBF_OK_BUTTON Or TASKDIALOG_COMMON_BUTTON_FLAGS.TDCBF_CANCEL_BUTTON ' 设置常用按钮
config.pszWindowTitle = "Title"
config.dwMainIcon = IntPtr.Zero ' 设置主图标句柄
config.pszMainInstruction = "Main Instruction"
config.pszContent = "Content"
config.cButtons = 2 ' 设置按钮数量
config.pButtons = Marshal.StringToHGlobalUni("Button 1" & vbNullChar & "Button 2") ' 设置按钮文本
config.nDefaultButton = 1 ' 设置默认按钮索引
config.cRadioButtons = 2
config.pRadioButtons = Marshal.StringToHGlobalUni("Button 3" & vbNullChar & "Button 4") ' 设置按钮文本
config.nDefaultRadioButton = 1
config.pszVerificationText = " "
config.pszExpandedInformation = " "
config.pszExpandedControlText = " "
config.pszCollapsedControlText = " "
config.dwFooterIcon = 65543
config.pszFooter = "e"
config.pCallback = 0
config.lpCallbackData = 0
config.cxWidth = 0
Dim pConfig As IntPtr = IntPtr.Zero
Marshal.StructureToPtr(config, pConfig, False)
Dim buttonResult As Integer = 0
Dim radioButtonResult As Integer = 0
Dim verificationFlagChecked As Boolean = False
TaskDialogIndirect(pConfig, buttonResult, radioButtonResult, verificationFlagChecked)
Marshal.FreeHGlobal(pConfig)
End Sub
End Class
源代码在这,大家可以拿去分析一下,这个是C知道写的