Visual Studio 6.0 的 AutoText 插件





5.00/5 (6投票s)
2001 年 3 月 4 日

117811

1491
将 MS Word (tm) 的自动文本功能添加到 Developer Studio (tm)
引言
我个人使用这个工具已经大约一年了,它工作得很好。在阅读了 CodeProject 上的一些文章后,我觉得我应该为社区贡献一些有用的东西。所以,它来了……
这个插件为 Visual Studio 添加了一个 AutoText 功能,类似于 MS Word (tm) 中的功能。它可以在键入时替换拼写错误或用完整文本替换缩写词。这可以用来缩写难以输入的名称;例如,UNUSED_ALWAYS(我缩写为 ua)。或者纠正常见的拼写错误;例如,键入 TURE 并将其替换为 TRUE。
当前版本:Version 1,0,0.1 (2001年2月21日)
如有更新,我将在此发布。
安装
您可以下载 DeveloperStudioAutoText_src.zip 文件自行编译,或者直接下载可直接使用的版本 DeveloperStudioAutoText_addin.zip,然后将 DeveloperStudioAutoText.dll 文件复制到 c:\Program Files\microsoft visual studio\common\msdev98\addins 或您安装 Visual Studio 的相应位置。- 将 DeveloperStudioAutoText.dll 复制到您想要的任何位置。一个不错的位置是在 Microsoft Visual Studio 文件夹下的
Common\MDev98\AddIns
。 - 打开 Visual Studio,选择:Tools | Customize...
- 转到 Add-ins and Macro files 选项卡,然后单击 Browse 按钮。
- 转到您复制 DeveloperStudioAutoText.dll 的文件夹并选择它。确保 "files of type" 列表框设置为 "Add-ins (.dll)"。
- 关闭对话框时,将出现一个工具栏,上面有 AutoText-Configuration 按钮(大写 "T" 下面有小写的 "Auto")和一个标记为 "H/C+" 的按钮,该按钮在 C(++) 和 .H 文件之间切换。
与其他工具栏按钮一样,您可以将此按钮移动到任何其他工具栏。 - 按左侧按钮(带有 "T" 的那个)来设置 AutoText 替换表。在这里,您可以启用/禁用插件,方法是切换 Enable AutoText 复选框的开/关。
- 在 Replace 编辑框中输入要替换的文本,在 With 编辑框中输入要替换成的内容。然后按
或单击 Add New 添加它。 - 使用 Delete 按钮可以删除不需要的条目,如果替换文本已存在,Add New 按钮将变为 Replace,以便您修改现有条目。
- 按下 OK 按钮后,所有设置都将写入文件 %windir%\DSAutoText.CFG,实际上这是一个标准的 .INI 文件。您可以手动编辑它(它的语法非常直接:在 [Substitutions] 部分,等号左侧是原始文本,右侧是要替换成的内容。
你不应该修改 WordListState。这包含列表视图的设置(列宽和顺序)。 - 在键入时,插件会监视空格和开括号。当您输入任何这些字符时,它会搜索其替换列表,并在找到合适的匹配项时,用替换文本替换您输入的单词。
- 如果替换的文本不是您想要的,只需使用编辑/撤销或按退格键将其删除,然后重新键入原始文本。下次输入停止字符(空格或括号)时,它会询问是否替换,您可以通过按 ESC 或选择 DON'T REPLACE 来取消替换。
工作原理
加载时,它会尝试识别主窗口和 MDIClientArea 窗口(方法 CDSAddIn::OnConnection)。有趣的部分如下://First find the main window hWnd = ::GetActiveWindow(); while( hWnd && hWnd != hDesktopWnd ) { m_hDevStudioWnd = hWnd; hWnd = ::GetParent(hWnd); } GetWindowText( m_hDevStudioWnd, szWindowTitle, 512 ); if( strstr( szWindowTitle, "Microsoft Visual C++" ) ) { m_wndDevStudioMainWindow.SubclassWindow( m_hDevStudioWnd ); // The MDIArea always has ID 0xe900 m_hDevStudioMDIArea = GetDlgItem( m_hDevStudioWnd, 0xe900 ); m_wndMDIAreaManager.SubclassWindow( m_hDevStudioMDIArea ); }行
m_wndDevStudioMainWindow.SubclassWindow( m_hDevStudioWnd );
对 DevStudio 主窗口(类 C_DevStudioMainWindowFilter
)进行子类化。这是必要的,因为否则它会将某些光标移动转换为 WM_COMMAND 消息。但由于我们需要光标消息,因此我们将其拦截。还有一个类 C_DevStudioMainWindowFilter
,主要用于轻松获取活动 MDI(又名文本编辑器)窗口并处理菜单和普通按键。
关于是否需要替换的决策过程可以在 C_ActiveMDIWindowFilter::OnSpecialKeyPressed()
中找到。值得注意的是对 m_bEnableAutoCorrect
的处理,它决定是自动替换输入的文本,还是询问用户是否应该替换(在用户按 delete 后,它将被设置为 FALSE,并在按下停止字符时恢复为 TRUE)。
实际替换发生在 CheckAutoText()
中。如果 bAutoReplace 为 TRUE,则在可能的情况下文本将立即被替换。否则,只会返回替换文本(如果可用)。如果用户输入的文本没有可以替换的内容,则返回值将为空,文本不会改变。
已知问题
在某些系统上,MsDev6 在使用宏/插件时,在从同一文本窗口复制文本后,向编辑器粘贴文本(Edit/Paste)时存在问题。据我所知,可以通过添加以下注册表项来禁用新的堆管理器来解决此问题(至少在我的同事的系统上有效)。
使用 regedit 添加此项
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\MSDEV.EXE
然后在下面添加一个名为 DisableHeapLookaside 的字符串值,并将其设置为 "1"。
此插件使用 Visual C++ 6.0 Service Pack 4 构建。我也在 Service Pack 3 上对其进行了测试,它在那边也运行良好,所以我认为它不会与其他 Service Pack 存在问题。
有关更多信息,请参阅知识库中的 Q231652 和 Q195009。
版本历史
- 版本 1,0,0.1
- 首次公开发布。
致谢
对主窗口进行子类化的最初想法(但不是技术)也借鉴于 Code Guru 上找到的一个插件。但一年多过去了,我忘了是谁了。抱歉。一些版权声明摘自 Yuri Tkachov 的增强型窗口列表提交。我希望他不会介意。
此外,我必须感谢我的公司(MicroMotion GmbH),允许我使用他们的设备(以及一些工作时间)来编写这个插件。(顺便说一下,这个插件不符合内部编码标准 - 这是一个业余项目)
关于 Christoph Weber
Christoph Weber 是 MicroMotion GmbH 核心开发团队的成员。他已经用汇编/C/C++(以及其他一些语言)编程了 18 年,用 Visual C++/MFC 和 ATL 编程了 6 年。