SendMessage WM_SETTEXT 修改Pdf另存为对话框中的文件名乱码

蓝帆·雨轩 2019-04-18 02:10:36
我使用SendMessage修改Pdf另存为对话框中的文件名,已经抓到EDIT的句柄,但是写入时是乱码,用WM_COPYDATA没响应,用WM_SETTEXT可以发送,但是文件名那里是乱码。可能是因为系统默认Unicode,但是另存为对话框的文件名那里需要的是ANSI。

SendMessage(_hwnd,WM_SETTEXT,IntPtr.Zero,"要发送的文件名")

"要发送的文件名"那里怎样正确发送到PDF另存为对话框。谢谢。
...全文
272 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
stherix 2019-04-19
  • 打赏
  • 举报
回复
引用 12 楼 Yiqun_Zhao 的回复:
[quote=引用 10 楼 stherix 的回复:] [quote=引用 9 楼 Yiqun_Zhao 的回复:] size能正确取到,但是接下来SendMessage(_ControlHwnd, CType(WM_GETTEXT, Integer), title.Capacity, title)就报错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
我用的SendMessageA,然后Dllimport的时候Charset=Ansi 读取记事本的文本,ps的另存为对话框,操作系统的Win+R运行里面的命令框,都是正常的,无论是GETTEXT还是SETTEXT 你也改一下charset,再把stringbuilder的capacity弄大点,不要刚好够[/quote] ================================================ 你这些方法我开始就试过了。和我64位Win10有关系吗?[/quote] 我也是win10 64位的 但是既然那个文本框的确是winSDK的Edit控件,就不应该存在不同操作系统不兼容的情况 我觉得是编码方面的问题,那个软件估计是用的Unicode 但是这些方法你都试过,所以也挺奇怪的
蓝帆·雨轩 2019-04-19
  • 打赏
  • 举报
回复
引用 11 楼 stherix 的回复:
另外还可以用vs自带的spy++工具看看它能获取到文本值不
=========================================== spy++有值
蓝帆·雨轩 2019-04-19
  • 打赏
  • 举报
回复
引用 10 楼 stherix 的回复:
[quote=引用 9 楼 Yiqun_Zhao 的回复:] size能正确取到,但是接下来SendMessage(_ControlHwnd, CType(WM_GETTEXT, Integer), title.Capacity, title)就报错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
我用的SendMessageA,然后Dllimport的时候Charset=Ansi 读取记事本的文本,ps的另存为对话框,操作系统的Win+R运行里面的命令框,都是正常的,无论是GETTEXT还是SETTEXT 你也改一下charset,再把stringbuilder的capacity弄大点,不要刚好够[/quote] ================================================ 你这些方法我开始就试过了。和我64位Win10有关系吗?
stherix 2019-04-19
  • 打赏
  • 举报
回复
另外还可以用vs自带的spy++工具看看它能获取到文本值不
stherix 2019-04-19
  • 打赏
  • 举报
回复
引用 9 楼 Yiqun_Zhao 的回复:
size能正确取到,但是接下来SendMessage(_ControlHwnd, CType(WM_GETTEXT, Integer), title.Capacity, title)就报错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
我用的SendMessageA,然后Dllimport的时候Charset=Ansi 读取记事本的文本,ps的另存为对话框,操作系统的Win+R运行里面的命令框,都是正常的,无论是GETTEXT还是SETTEXT 你也改一下charset,再把stringbuilder的capacity弄大点,不要刚好够
蓝帆·雨轩 2019-04-19
  • 打赏
  • 举报
回复
引用 8 楼 stherix 的回复:
[quote=引用 7 楼 Yiqun_Zhao 的回复:] [quote=引用 5 楼 stherix 的回复:] [quote=引用 4 楼 Yiqun_Zhao 的回复:] SendMessage、SendMessageA、SendMessageW,我都试过了。
我用SendMessageA和StringToHGlobalAnsi的组合 向其他窗体的文本框之类的发消息 都可以正确显示出中文 你用在pdf另存写一个中文文件名 然后用WM_GETTEXT回来,看看是什么编码的[/quote] =========================================== 不只是中文,英文/数字也是乱码。[/quote] 还是GETTEXT看看保存对话框里的原有英文数字是什么编码吧[/quote] =========================================== Dim size As Integer = SendMessage(_ControlHwnd, WM_GETTEXTLENGTH, 0, 0) If size > 0 Then Dim title As New StringBuilder(size + 1) SendMessage(_ControlHwnd, CType(WM_GETTEXT, Integer), title.Capacity, title) End If size能正确取到,但是接下来SendMessage(_ControlHwnd, CType(WM_GETTEXT, Integer), title.Capacity, title)就报错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
蓝帆·雨轩 2019-04-19
  • 打赏
  • 举报
回复
谢谢你热心回答,如下方式搞定: IntPtr _ptr = Marshal.AllocHGlobal(256); SendMessage(_ControlHwnd, WM_GETTEXT, 255, _ptr); txtCValue.Text = Marshal.PtrToStringAnsi(_ptr); _ptr = Marshal.StringToHGlobalAnsi(txtCValue.Text); SendMessage(_ControlHwnd, WM_SETTEXT, 0, _ptr);
stherix 2019-04-18
  • 打赏
  • 举报
回复
引用 7 楼 Yiqun_Zhao 的回复:
[quote=引用 5 楼 stherix 的回复:] [quote=引用 4 楼 Yiqun_Zhao 的回复:] SendMessage、SendMessageA、SendMessageW,我都试过了。
我用SendMessageA和StringToHGlobalAnsi的组合 向其他窗体的文本框之类的发消息 都可以正确显示出中文 你用在pdf另存写一个中文文件名 然后用WM_GETTEXT回来,看看是什么编码的[/quote] =========================================== 不只是中文,英文/数字也是乱码。[/quote] 还是GETTEXT看看保存对话框里的原有英文数字是什么编码吧
蓝帆·雨轩 2019-04-18
  • 打赏
  • 举报
回复
引用 5 楼 stherix 的回复:
[quote=引用 4 楼 Yiqun_Zhao 的回复:] SendMessage、SendMessageA、SendMessageW,我都试过了。
我用SendMessageA和StringToHGlobalAnsi的组合 向其他窗体的文本框之类的发消息 都可以正确显示出中文 你用在pdf另存写一个中文文件名 然后用WM_GETTEXT回来,看看是什么编码的[/quote] =========================================== 不只是中文,英文/数字也是乱码。
蓝帆·雨轩 2019-04-18
  • 打赏
  • 举报
回复
引用 3 楼 stherix 的回复:
[quote=引用 2 楼 Yiqun_Zhao 的回复:] [quote=引用 1 楼 stherix的回复:]Marshal.StringToHGlobalAnsi("要发送的文件名")
这个我测试过了,还是乱码。[/quote] 你的SendMessage是SendMessageA吗[/quote] ============================================= SendMessage、SendMessageA、SendMessageW,我都试过了。
stherix 2019-04-18
  • 打赏
  • 举报
回复
引用 4 楼 Yiqun_Zhao 的回复:
SendMessage、SendMessageA、SendMessageW,我都试过了。
我用SendMessageA和StringToHGlobalAnsi的组合 向其他窗体的文本框之类的发消息 都可以正确显示出中文 你用在pdf另存写一个中文文件名 然后用WM_GETTEXT回来,看看是什么编码的
蓝帆·雨轩 2019-04-18
  • 打赏
  • 举报
回复
SendMessage、SendMessageA、SendMessageW,我都试过了。
stherix 2019-04-18
  • 打赏
  • 举报
回复
引用 2 楼 Yiqun_Zhao 的回复:
[quote=引用 1 楼 stherix的回复:]Marshal.StringToHGlobalAnsi("要发送的文件名")
这个我测试过了,还是乱码。[/quote] 你的SendMessage是SendMessageA吗
蓝帆·雨轩 2019-04-18
  • 打赏
  • 举报
回复
引用 1 楼 stherix的回复:
Marshal.StringToHGlobalAnsi("要发送的文件名")
这个我测试过了,还是乱码。
stherix 2019-04-18
  • 打赏
  • 举报
回复
Marshal.StringToHGlobalAnsi("要发送的文件名")

16,722

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧