为什么我往VS.NET编辑器窗口和MSN的消息窗口发WM_GETTEXT和EM_GETSEL,什么也得不到? 研究了好久,拿SPY++看了半天,也没有搞清楚是怎么回事,不仅WM_GETTEXT/WM_SETTEXT,就连常用EM_****消息也是有去无回。我猜是不是这几个编辑器把它们都给屏蔽掉了?请教大家有没有办法通过发消息的方法拿到这些窗口中选中的TEXT? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我用spy++监视到在这些窗口粘贴的时候,会有WM_IME_SETCONTEXT之类的消息出现,但是我去查帮助,发现这个只是控制输入法的阿,和这些都没有关系阿。刚才还查到,的确是这些窗口屏蔽了一些消息,这是不是意味着没有可能通过发消息拿到窗口中选中的TEXT了呢?另外:还发现Word之类的软件也不行 http://support.microsoft.com/default.aspx?scid=kb;en-us;82293 这个SPY不是万能的.不要指往它能给你做太多的事 得到窗口句柄的代码如下(是C#代码,但思想和VC实现没有什么区别)IntPtr ptr =Windows.API.GetForegroundWindow();lpPoint = new POINT();//得到Caret在屏幕上的位置if (ptr.ToInt32() != 0){ IntPtr targetThreadID = Windows.API.GetWindowThreadProcessId(ptr,IntPtr.Zero); IntPtr localThreadID = Windows.API.GetCurrentThreadId(); if (localThreadID != targetThreadID) { //attach the local threadID to targetThreadID Windows.API.AttachThreadInput(localThreadID,targetThreadID,1); //get the position of caret ptr = Windows.API.GetFocus(); if (ptr.ToInt32() != 0) { Windows.API.GetCaretPos(out lpPoint); Windows.API.ClientToScreen(ptr,ref lpPoint); } Windows.API.AttachThreadInput(localThreadID,targetThreadID,0); } }///从Caret的位置得到具有输入焦点控件handlehandle = Windows.API.WindowFromPoint(point);差不多可以确定吧,因为我一边拿着SPY++盯着那个窗口,一边用VS.NET调试我的程序,呵呵,有几次我还手动的把窗口句柄写进Debug窗口中的handle变量中。所以,应该可以肯定这些句柄是正确的。现在我几乎可以确定了:VS.NET 的editor窗口 和 MSN的消息窗口屏蔽我上面提到的那些消息,因为我还发现如果用sendmessage发送一个keydown和keyup的过去,比如:CTRL+V,它们都是可以做出正确的反应的, 为什么要屏蔽呢,真可怜我的程序啊,居然最需要的地方,都用不了 :~(谢谢 laiyiling(最熟悉的陌生人) 提供的链接,但它提到的两条RESOLUTION好像还是不起作用阿。继续等待 整个项目中可引用的常量或变量在头文件中如何定义 问一个关于_variant_t转换的精度问题~ 【请教】【技术贴】请看这个网站的弹窗代码 以及屏蔽策略 关于网络语音通信使用WaveOut系列函数的问题 关于窗口截图的问题 关于在MFC中扩展CSplitterWnd类。 视窗中有一系列点,怎样用一条圆滑曲线将这些点连接起来(曲线要通过每个点)?? 给你100分帮我估个价!!做一套网页要多少钱!参与者都有分 属性表问题 求教碰到如下问题怎么调试 求助 Visual C++ 6.0 技术内幕(第五版)配套光盘的源码 公钥和私钥不是成对的吗,我为什么没有私钥文件!
刚才还查到,的确是这些窗口屏蔽了一些消息,这是不是意味着没有可能通过发消息拿到窗口中选中的TEXT了呢?另外:还发现Word之类的软件也不行
http://support.microsoft.com/default.aspx?scid=kb;en-us;82293
lpPoint = new POINT();//得到Caret在屏幕上的位置
if (ptr.ToInt32() != 0)
{
IntPtr targetThreadID = Windows.API.GetWindowThreadProcessId(ptr,IntPtr.Zero);
IntPtr localThreadID = Windows.API.GetCurrentThreadId();
if (localThreadID != targetThreadID)
{
//attach the local threadID to targetThreadID
Windows.API.AttachThreadInput(localThreadID,targetThreadID,1);
//get the position of caret
ptr = Windows.API.GetFocus();
if (ptr.ToInt32() != 0)
{
Windows.API.GetCaretPos(out lpPoint);
Windows.API.ClientToScreen(ptr,ref lpPoint);
}
Windows.API.AttachThreadInput(localThreadID,targetThreadID,0);
}
}///从Caret的位置得到具有输入焦点控件handle
handle = Windows.API.WindowFromPoint(point);差不多可以确定吧,因为我一边拿着SPY++盯着那个窗口,一边用VS.NET调试我的程序,呵呵,有几次我还手动的把窗口句柄写进Debug窗口中的handle变量中。所以,应该可以肯定这些句柄是正确的。
现在我几乎可以确定了:VS.NET 的editor窗口 和 MSN的消息窗口屏蔽我上面提到的那些消息,因为我还发现如果用sendmessage发送一个keydown和keyup的过去,比如:CTRL+V,它们都是可以做出正确的反应的, 为什么要屏蔽呢,真可怜我的程序啊,居然最需要的地方,都用不了 :~(谢谢 laiyiling(最熟悉的陌生人) 提供的链接,但它提到的两条RESOLUTION好像还是不起作用阿。继续等待