C#屏幕定点取词
初学c#,我想用c#实现屏幕的某一固定坐标点的取词
在网上搜索后(http://www.cnblogs.com/tuyile006/archive/2006/12/05/582381.html)可以用金山词霸中的XdictGrb.dll组件取鼠标下的词语,可我希望能实现固定坐标点下的取词,用nhw32.dll后一直不能成功,1. DWORD WINAPI BL_SetFlag32(UINT nFlag,
HWND hNotifyWnd,
int MouseX,
int MouseY)
功能:
启动或停止取词。
参数:
nFlag
[输入] 指定下列值之一:
GETWORD_ENABLE: 开始取词。在重画被取单词区域前设置此标志。nhw32.dll是通过
重画单词区域,截取TextOutA, TextOutW, ExtTextOutA,
ExtTextOutW等Windows API函数的参数来取词的。
GETWORD_DISABLE: 停止取词。
hNotifyWnd
[输入] 通知窗口句柄。当取到此时,向该通知窗口发送一登记消息:GWMSG_GETWORDOK。(难道还要用到消息???)
MouseX
[输入] 指定取词点的X坐标。
MouseY
[输入] 指定取词点的Y坐标。
希望能有大大给指点指点
初学c#,我想用c#实现屏幕的某一固定坐标点的取词
在网上搜索后(http://www.cnblogs.com/tuyile006/archive/2006/12/05/582381.html)可以用金山词霸中的XdictGrb.dll组件取鼠标下的词语,可我希望能实现固定坐标点下的取词,用nhw32.dll后一直不能成功,1. DWORD WINAPI BL_SetFlag32(UINT nFlag,
HWND hNotifyWnd,
int MouseX,
int MouseY)
功能:
启动或停止取词。
参数:
nFlag
[输入] 指定下列值之一:
GETWORD_ENABLE: 开始取词。在重画被取单词区域前设置此标志。nhw32.dll是通过
重画单词区域,截取TextOutA, TextOutW, ExtTextOutA,
ExtTextOutW等Windows API函数的参数来取词的。
GETWORD_DISABLE: 停止取词。
hNotifyWnd
[输入] 通知窗口句柄。当取到此时,向该通知窗口发送一登记消息:GWMSG_GETWORDOK。(难道还要用到消息???)
MouseX
[输入] 指定取词点的X坐标。
MouseY
[输入] 指定取词点的Y坐标。
希望能有大大给指点指点
somebody help me .
要Hook系统函数的。网上有很多源码可以参考。我想C#想写好他的水平一定很高!
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;namespace ScreenWords
{
class Program
{
[DllImport(@"D:\Program\CPP\屏幕取词_CSDN\bin\debug\nhw32.dll")]
private static extern uint BL_SetFlag32(uint nFlag, IntPtr hNotifyWnd, int MouseX, int MouseY); [DllImport(@"D:\Program\CPP\屏幕取词_CSDN\bin\debug\nhw32.dll")]
private static extern uint BL_GetText32([MarshalAs(UnmanagedType.LPStr)]StringBuilder lpszCurWord, int nBufferSize, ref Rectangle lpWordRect); [DllImport(@"D:\Program\CPP\屏幕取词_CSDN\bin\debug\nhw32.dll")]
private static extern bool SetNHW32(); static void Main(string[] args)
{
int bufSize = 256;
StringBuilder sb = new StringBuilder(bufSize); Rectangle rect = new Rectangle(0, 0, 100, 100); if (SetNHW32())
{
BL_SetFlag32(1001, IntPtr.Zero, 100, 100);
BL_GetText32(sb, bufSize, ref rect);
} Console.ReadLine();
}
}
}
private static extern uint BL_GetText32([MarshalAs(UnmanagedType.LPStr)]StringBuilder lpszCurWord, int nBufferSize, ref Rectangle lpWordRect);这是唯一一个你需要注意的函数.因为C++的声明中, 第三个参数是LPRECT lpWordRect, 这是一个指向RECT的指针, 而在C++函数内部, 它会对这个指针进行修改, 如果你不加ref, 那么C++将不能修改这个RECT, 会抛一个"内存违规"的异常出来. 所以需要加ref.对于P/Invoke, 类型封送是难点, 对于这种开源的东西, 你完全可以去阅读它的C++源代码, 知道它做了什么事, 你自己类型封送就很简单了.
运行后sb跟踪显示值为null Help!!!
为了测试所取的点有词 我用了一个timer控件 然后在它的tick事件中寻找有词的地方进行测试:
private void timer1_Tick(object sender, EventArgs e)
{
if (this.flag) //设置的标志,true时取词
{
this.rect = new Rectangle(Cursor.Position.X - 20 , Cursor.Position.Y - 20, 100, 100);
BL_SetFlag32(1001, IntPtr.Zero, Cursor.Position.X, Cursor.Position.Y);
BL_GetText32(sb, bufSize, ref rect);
this.textBox1.Text = sb.ToString();
}
}结果没有取到词
这样也不行 。
你是用的c#来调用这个dll还是用的其他语言啊 ?有没有其他好的办法能实现屏幕定点的取词(useing c#) ?感谢
BL_SetFlag32(1001, IntPtr.Zero, 100, 100);RECT初始化大小是无所谓的, 这个是在dll会修改.你首先确定某个坐标点有词, 然后在调试模式下, 一步一步跟, 别太快. 另外, 最好把鼠标放在那个点上不要动.
原先的rect的height width 等全部都被修改成了 0
还是取不到值
不会是dll的问题吧可以的话能不能发你的dll我试一下
[email protected]
一个196k 一个128k 还有一个44k
现在我用128k的这个来取的时候
rect不再是0了
不过还是取不到值sb一直是空的
谢谢shrinerain 及大家