从Windows打开调制解调器配置对话框(C#)

时间:2016-02-18 15:58:40

标签: c# windows configuration modem dllhost

是否有机会使用c#程序从Windows控制中心打开调制解调器对话框?

具体对话框是: Windows - >控制中心 - >电话和调制解调器 - >选项卡高级 - >选择提供者 - >按钮配置

启动的进程在任务管理器中显示为dllhost.exe。

谢谢和亲切的问候 茎

1 个答案:

答案 0 :(得分:0)

您可以通过"运行"打开电话和调制解调器控制面板项目。 telephon.cpl "程序"。您可以通过p / invoke或使用RunDll32直接使用SHELL32函数来完成此操作。

RunDll32是一个包含在windows中的程序,它加载DLL,并在其中运行一个函数,如命令行参数所指定的。这通常是shell(资源管理器)运行控制面板小程序的方式。

您也可以自己使用shell32函数直接加载CPL。

以下是示例代码:

[System.Runtime.InteropServices.DllImport("shell32", EntryPoint = "Control_RunDLLW", CharSet = System.Runtime.InteropServices.CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
private static extern bool Control_RunDLL(IntPtr hwnd, IntPtr hinst, [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPWStr)] string lpszCmdLine, int nCmdShow);

private void showOnMainThread_Click(object sender, EventArgs e)
{
    const int SW_SHOW = 1;
    // this does not work very well, the parent form locks up while the control panel window is open
    Control_RunDLL(this.Handle, IntPtr.Zero, @"telephon.cpl", SW_SHOW);
}

private void showOnWorkerThread_Click(object sender, EventArgs e)
{
    Action hasCompleted = delegate
    {
        MessageBox.Show(this, "Phone and Modem panel has been closed", "Notification", MessageBoxButtons.OK, MessageBoxIcon.Information);
    };

    Action runAsync = delegate
    {
        const int SW_SHOW = 1;
        Control_RunDLL(IntPtr.Zero, IntPtr.Zero, @"telephon.cpl", SW_SHOW);
        this.BeginInvoke(hasCompleted);
    };

    // the parent form continues to be normally operational while the control panel window is open
    runAsync.BeginInvoke(null, null);
}

private void runOutOfProcess_Click(object sender, EventArgs e)
{
    // the control panel window is hosted in its own process (rundll32)
    System.Diagnostics.Process.Start(@"rundll32.exe", @"shell32,Control_RunDLL telephon.cpl");
}