请教C# PostMessage发送消息给记事本的问题

shaoyk2007 2007-02-22 12:18:14
写了C#进程间交互的类,目的在于往一个已打开的记事本中写入一句话。
句柄正常取得,却无法将_sendVal显示在记事本中,请高手指教。
class Note
{
[DllImport("user32.dll")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern IntPtr PostMessage(IntPtr hwnd, int wMsg, IntPtr wParam, string lParam);
[DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
public void SendMsgToNote(string _sendVal)
{
string _parentWindow = "无标题 - Notepad2";
string _class = "Scintilla";
string _control = "";
const int WM_COPYDATA = 0x004A;
IntPtr _hwnd_win;
IntPtr _hwnd_textbox = new IntPtr(0);
_hwnd_win = FindWindow(null, _parentWindow);
_hwnd_textbox = FindWindowEx(_hwnd_win, _hwnd_textbox, _class, _control);
PostMessage(_hwnd_textbox, WM_COPYDATA, IntPtr.Zero, _sendVal);
}
}
...全文
4175 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
yebigroc 2007-12-13
  • 打赏
  • 举报
回复
太假了,明显是作弊的帖子,把分全给自己了,晕
shaoyk2007 2007-02-24
  • 打赏
  • 举报
回复
特别感谢 sjiutian() 给我许多这方面的资料。
shaoyk2007 2007-02-24
  • 打赏
  • 举报
回复
问题已经解决!谢谢各位热心解答。
kingclever 2007-02-24
  • 打赏
  • 举报
回复
占时不太懂........
zyip 2007-02-23
  • 打赏
  • 举报
回复
lannet 2007-02-23
  • 打赏
  • 举报
回复
cangwu_lee 2007-02-22
  • 打赏
  • 举报
回复
不可以使用 string 类型,这个类型和 C++ 里面的类型不相等。使用转换成指针类型,再发送。


shaoyk2007 2007-02-22
  • 打赏
  • 举报
回复
EM_REPLACESEL:测试了notepad、UE、Editplus等文本是可以接收到,可无意中发现POPO、QQ等对话框就接收不到信息。不知道为什么,请高手指点!

=====================================================

那些对话框可能自己过滤消息的


=====================================================

可是却能响应其他一些参数的事件。
如SendMessage(_hwnd_textbox, 16, new IntPtr(c), new IntPtr(0));

王集鹄 2007-02-22
  • 打赏
  • 举报
回复
将输入焦点
王集鹄 2007-02-22
  • 打赏
  • 举报
回复
将输入放到想要操作的控件中

SendKeys.Send("Zswang");
shaoyk2007 2007-02-22
  • 打赏
  • 举报
回复
c# SendKeys()
怎么用呢?
朋友能指点指点吗?
darkh0rse 2007-02-22
  • 打赏
  • 举报
回复
zswang(伴水清清)(专家门诊清洁工):不是标准的Edit控件

==============

同意
王集鹄 2007-02-22
  • 打赏
  • 举报
回复
那是软件的自我保护
避免你做一个发送垃圾消息的机器人
或者不是标准的Edit控件
可以尝试通过模拟按钮输入文本
SendKeys()
VirtualDesktop 2007-02-22
  • 打赏
  • 举报
回复
EM_REPLACESEL:测试了notepad、UE、Editplus等文本是可以接收到,可无意中发现POPO、QQ等对话框就接收不到信息。不知道为什么,请高手指点!

=====================================================

那些对话框可能自己过滤消息的
darkh0rse 2007-02-22
  • 打赏
  • 举报
回复
跨进程的话用SendMessageTimeout试试
shaoyk2007 2007-02-22
  • 打赏
  • 举报
回复
EM_REPLACESEL:测试了notepad、UE、Editplus等文本是可以接收到,可无意中发现POPO、QQ等对话框就接收不到信息。不知道为什么,请高手指点!
shaoyk2007 2007-02-22
  • 打赏
  • 举报
回复
使用WM_COPYDATA一般两个进程都是由自己编写

也就是我要自己写接收方才有效。我明白为什么老是接收不到消息了。

可EM_REPLACESEL也有的软件不能接收到消息。不知道为什么。
shaoyk2007 2007-02-22
  • 打赏
  • 举报
回复
谢谢 zswang(伴水清清)(专家门诊清洁工) 提供EM_REPLACESEL

我想在某个特定的textbox(java程序中)中设置特定的value(复制本程序的textbox1.text)。该用什么参数呢?WM_COPYDATA如何操作?
王集鹄 2007-02-22
  • 打赏
  • 举报
回复
这个消息的原义并不是复制文本
而是跨进程传递结构用
传递的结构是用户自定义的

使用WM_COPYDATA一般两个进程都是由自己编写
WM_SETTEXT才是设置窗体文本
可以用这样消息
EM_REPLACESEL = 0x00C2; // 替换选择的文字 // 只会在光标处插入文字
shaoyk2007 2007-02-22
  • 打赏
  • 举报
回复
用WM_SETTEXT可以解决。

可不知道为什么WM_COPYDATA总不能复制成功。
刚刚改成WM_SETTEXT可以(只设置标题),由于notepad内用的文本框本身标题=内容,所以在notepad 用WM_SETTEXT可以设置成功,而别的地方就不能复制。

不知道哪位朋友用WM_COPYDATA做过的例子,再指点一二。
加载更多回复(8)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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