10

这应该很简单,但显然不是。由于..Windows 3 左右,有一个控制面板称为电话或电话和调制解调器。在那个控制面板中有一堆关于调制解调器如何拨号的信息,假设你连接了一个调制解调器。例如,是否需要拨 9 才能出去,区号是多少等等。如何以编程方式访问此信息?我正在使用 C# .NET 2010。

4

3 回答 3

12

您将需要在 Windows 中使用 Tapi 或从注册表中提取信息。根据 Microsoft Tapi 3.0 的设计目的不是从托管代码中使用,尽管第一个链接似乎已经做到了。

一些文章可以看:

  1. Tapi3.0应用开发
  2. VB.Net 访问 TAPI 拨号规则

来自链接#2

看看这些 TAPI 函数:

  1. lineGetTranslateCaps
  2. lineTranslateAddress
  3. lineTranslateDialog
  4. lineSetCurrentLocation
  5. lineGetCountry
  6. tapiGetLocationInfo

信息存储在注册表中: HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Locations

于 2011-12-08T23:50:47.037 回答
8

我找不到通过 .Net TAPI 包装器访问它的方法(经过不长时间的搜索),所以我启动了procmon并找到了它存储在注册表中的位置,这是访问它的代码(你可以适应根据您的具体需求):

RegistryKey locationsKey =
    Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Locations");
if (locationsKey == null) return;
string[] locations = locationsKey.GetSubKeyNames();
foreach (var location in locations)
{
    RegistryKey key = locationsKey.OpenSubKey(location);
    if (key == null) continue;
    Console.WriteLine("AreaCode {0}",key.GetValue("AreaCode"));
    Console.WriteLine("Country {0}",(int) key.GetValue("Country"));
    Console.WriteLine("OutsideAccess {0}", key.GetValue("OutsideAccess"));
}

笔记 :

  1. 如果有 .net 兼容的 API,我建议使用官方 API。
  2. 不保证此代码可在 Win 7 以外的其他操作系统上运行
  3. 如果您需要提示用户填写这些详细信息,您可以使用以下命令启动配置工具:

Process.Start(@"C:\Windows\System32\rundll32.exe",@"C:\Windows\System32\shell32.dll,Control_RunDLL C:\Windows\System32\telephon.cpl");

于 2011-12-09T00:12:28.350 回答
0

更多代码来获取前缀

class Program
{
    static void Main(string[] args)
    {
        string rootLocation = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Locations";
        getRegistryValues(rootLocation);
        Console.ReadLine();
    }

    public static void getRegistryValues(string rootLocation)
    {
        RegistryKey locationsKey =
        Registry.LocalMachine.OpenSubKey(rootLocation);
        if (locationsKey == null) return;
        string[] locations = locationsKey.GetSubKeyNames();
        Console.WriteLine(locations.Length.ToString());
        foreach (var location in locations)
        {
            Console.WriteLine(location.ToString());
            RegistryKey key = locationsKey.OpenSubKey(location);
            if (key == null) continue;
            foreach (string keyName in key.GetValueNames())
            {                  

                if (keyName.Equals("Prefixes"))
                {
                    string[] Prefixes = ((string[])(key.GetValue(keyName)));
                    Console.Write("Prefixes ");
                    foreach (string prefix in Prefixes)
                    {
                        Console.Write(prefix);
                    }

                }
                else
                {
                    Console.WriteLine(keyName + " {0}", key.GetValue(keyName));
                }

            }

            getRegistryValues(rootLocation+@"\"+location);


        }

    }
于 2014-01-08T21:28:30.127 回答