有没有机会使用 ac# 程序从 Windows 控制中心打开调制解调器对话框?
具体对话框是:Windows -> Control center -> Telephone and modem -> tab advanced -> select provider -> button configuration
启动的进程在任务管理器中显示为 dllhost.exe。
谢谢和亲切的问候 Bine
有没有机会使用 ac# 程序从 Windows 控制中心打开调制解调器对话框?
具体对话框是:Windows -> Control center -> Telephone and modem -> tab advanced -> select provider -> button configuration
启动的进程在任务管理器中显示为 dllhost.exe。
谢谢和亲切的问候 Bine
您可以通过“运行” telephon.cpl “程序”来打开电话和调制解调器控制面板项。您可以通过 p/invoke 直接使用 SHELL32 函数或使用 RunDll32 来执行此操作。
RunDll32 是一个包含在 Windows 中的程序,它加载一个 DLL,并在其中运行一个函数,由命令行参数指定。这通常是外壳(资源管理器)运行控制面板小程序的方式。
您也可以自己使用 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");
}