我正在开发一个C ++自定义向导,其中包含一个由下拉控件组成的页面UI。 我想用该机器上安装的所有输入语言填充此下拉控件。 (输入语言是一种文化/键盘布局对,用于确定键盘上的物理键如何映射或绘制为语言中的字符。)
我正在尝试获取此列表&在C#找到了办法。
public void GetLanguages() {
// Gets the list of installed languages.
foreach(InputLanguage lang in InputLanguage.InstalledInputLanguages) {
textBox1.Text += lang.Culture.EnglishName + '\n';
}
}
不,我想使用javascript实现相同的功能,因为我的自定义向导使用.js 我尝试在下面做,但得到js运行时错误:“Automation Server无法创建对象”。
<select class="sideBtn" size="1" id="LANGUAGE_LISTBOX" accesskey="L" title="Select Languages:">
<script type="text/javascript">
var obj = new ActiveXObject("System.Windows.Forms");
// Gets the list of installed languages.
for (var lang in obj.Windows.Forms.InputLanguage.InstalledInputLanguages)
{
document.write('<option value="' + lang.Culture.EnglishName + '">' + lang.Culture.EnglishName + '</option>');
}
</script>
</select>
我试过这样的,因为我已经引用了其他文章,这些文章显示了使用javascript ActiveX对象来驱动c#dll。 Triggering C# dll using Javascript ActiveX Object
有人能帮帮我吗?
此致 Deepthi
答案 0 :(得分:0)
使用此代码无法执行所需操作,因为没有COM对象注册为System.Windows.Forms
。但是你所关联的问题正是你想要的。
您有两个选项可以实现此选项,并选择其中一个选项取决于您是想在Javascript端还是整个InputLanguage
类中只拥有文化名称。我认为第一种方法对你来说已经足够了。对于第二个,您应该定义一个接口和一个新类,其中包含Javascript中所需的InputLanguage
的所有属性。
在界面IHello
中,更改此内容:
[DispId(1)]
string GetLanguages();
在课程CHello
中,更改此内容:
public string GetLanguages()
{
string[] langNames =InputLanguage.InstalledInputLanguages
.OfType<InputLanguage>()
.Select(lang => string.Format("{0}", lang.Culture.EnglishName))
.ToArray();
// This is a simple Join, just to give you the idea
// You better use a proper serialization like JSON
return string.Join(";", langNames);
}
您的javascript代码(假设您要么降低了安全级别,要么签署了ActiveX):
<script type="text/javascript">
myAx1 = new ActiveXObject("csharpAx.CHello");
if(myAx1 != null)
{
// Gets the list of installed languages.
for (var lang in obj.GetLanguages().split(";"))
{
document.write('<option value="' +
lang +
'">' +
lang +
'</option>');
}
}
</script>