gpt4 book ai didi

c# - 使用 WM_SETTEXT 设置记事本文本不会影响记事本实例中的 Text_Changed 事件

转载 作者:行者123 更新时间:2023-11-30 22:10:38 32 4
gpt4 key购买 nike

我几乎完成了一个项目,基本上,获取 .txt 文件的内容,使用“Process.Start("notepad")”打开一个新的记事本实例,然后使用“WM_SETTEXT”常量设置文本.我的这个工作很漂亮,所以我不需要任何帮助来设置文本。但是,我在测试过程中发现了一个小问题。在记事本实例中设置文本后,如果您关闭记事本窗口,它不会询问您是否要保存更改。这让我相信“WM_SETTEXT”不会触发记事本实例中的“Text_Changed”事件。

经过一番思考,我意识到这也可能意味着记事本仅在用户手动输入内容时才要求保存更改。所以也许不是检查“Text_Changed”,而是检查“Mouse_Down”事件?无论是哪一个,我都希望有人对记事本的“内部”工作原理以及它如何检查是否对需要保存的文本有“更改”有更多了解。

这是我的 SetText 函数的一部分:

        if (FileIO.Index != null && FileIO.Index.Count > 0)
{
MessageBox.Show("Recovering " + FileIO.Index.Count + " files...");
foreach (string guid in FileIO.Index)
{
if (!string.IsNullOrWhiteSpace(guid))
{
string contents = "";
if (!FileIO.Recover(guid, out contents))
MessageBox.Show("Couldn't recover '" + guid + "'");
else
{
Process p = Process.Start("notepad");
Thread.Sleep(200);
SetText(GetNotepadEditBox(p.MainWindowHandle), contents);
}
}
}
MessageBox.Show("Recovered all files successfully!", "Done recovering files!", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

方法:

private static IntPtr GetNotepadEditBox(IntPtr hParentWindow)
{
return Win32.FindWindowEx(hParentWindow, IntPtr.Zero, "Edit", null);
}

private void SetText(IntPtr hEditBox, string text)
{
IntPtr len = new IntPtr(text.Length);
StringBuilder sb = new StringBuilder(text);

Win32.SendMessage(hEditBox, Win32.WM_SETTEXT, len, sb);

sb = null;
len = IntPtr.Zero;
}

最佳答案

编辑控件将属性 textmodified 保持为不同的实体,允许应用程序围绕它们构建自己的修改管理。发送 WM_SETTEXT message不会自动设置已修改 标志。要设置此标志,您必须显式发送 EM_SETMODIFY message到编辑控件。

关于c# - 使用 WM_SETTEXT 设置记事本文本不会影响记事本实例中的 Text_Changed 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20723855/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com