Win8是否也为传统应用程序添加了内置的拼写检查器?

根据MSDN :

Windows 8中,拼写检查是内置的编辑控件。

那么,我有我的设置(高亮和自动更正)启用选项,我没有在Notepad.exe或我自己的传统Win32应用程序中看到这一点。

我需要做什么来启用(希望就是这么简单),这对我的应用程序? 我确实试图按照文章中的信息阅读大量的参考资料,但实际上并不清楚,似乎是为了创build自定义的提供者/解决scheme,但我会对任何“内置”行为感到满意。

Solutions Collecting From Web of "Win8是否也为传统应用程序添加了内置的拼写检查器?"

它仅内置于Rich Edit控件EM_SETLANGOPTIONS ,IMF_SPELLCHECKING选项。 您需要使用Rich Edit的更高版本,即MsftEdit.dll中的那个版本,而不是默认情况下获得的更常见的v2.0版本。

我在Winforms控件中试过,效果很好。 请注意,它不会使拼写检查互动,没有任何一个对话框可以让您从一组建议的选项中进行选择。 任何可以自动更正的内容,例如“从”到“从”到“从”到“拼写”,都会立即应用,没有自动更正的单词用红色下划线。 Ctrl + Z将自动更正的单词转换回原来的状态。

从这个C#代码到其他未指定的语言,你不应该有太多的麻烦。 有一些样板Winforms管道目前,关键是要使用LoadLibrary获得控件初始化的V5版本,所以你可以使用RichEdit50W窗口类的名称。 然后使用SendMessage()打开选项:

using System; using System.ComponentModel; using System.Windows.Forms; using System.Runtime.InteropServices; class RichTextBoxEx : RichTextBox { protected override CreateParams CreateParams { get { if (moduleHandle == IntPtr.Zero) { moduleHandle = LoadLibrary("msftedit.dll"); if (moduleHandle == IntPtr.Zero) throw new Win32Exception("Could not load Msftedit.dll"); } CreateParams createParams = base.CreateParams; createParams.ClassName = "RichEdit50W"; if (this.Multiline) { if (((this.ScrollBars & RichTextBoxScrollBars.Horizontal) != RichTextBoxScrollBars.None) && !base.WordWrap) { createParams.Style |= 0x100000; if ((this.ScrollBars & ((RichTextBoxScrollBars)0x10)) != RichTextBoxScrollBars.None) { createParams.Style |= 0x2000; } } if ((this.ScrollBars & RichTextBoxScrollBars.Vertical) != RichTextBoxScrollBars.None) { createParams.Style |= 0x200000; if ((this.ScrollBars & ((RichTextBoxScrollBars)0x10)) != RichTextBoxScrollBars.None) { createParams.Style |= 0x2000; } } } if ((BorderStyle.FixedSingle == base.BorderStyle) && ((createParams.Style & 0x800000) != 0)) { createParams.Style &= -8388609; createParams.ExStyle |= 0x200; } return createParams; } } protected override void OnHandleCreated(EventArgs e) { base.OnHandleCreated(e); if (Environment.OSVersion.Version.Major > 6 || Environment.OSVersion.Version.Major == 6 && Environment.OSVersion.Version.Minor >= 2) { int opts = (int)SendMessage(this.Handle, EM_GETLANGOPTIONS, IntPtr.Zero, IntPtr.Zero); opts |= IMF_SPELLCHECKING; SendMessage(this.Handle, EM_SETLANGOPTIONS, IntPtr.Zero, new IntPtr(opts)); } } private static IntPtr moduleHandle; private const int IMF_SPELLCHECKING = 0x0800; private const int EM_SETLANGOPTIONS = 0x0400 + 120; private const int EM_GETLANGOPTIONS = 0x0400 + 121; [DllImport("kernel32.dll", CharSet = CharSet.Auto)] private static extern IntPtr LoadLibrary(string lpFileName); [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp); }