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坐标。
希望能有大大给指点指点

解决方案 »

  1.   


    somebody help me .
      

  2.   

    这个现在做的好的,都是用C或C++做的。
    要Hook系统函数的。网上有很多源码可以参考。我想C#想写好他的水平一定很高!
      

  3.   

    c#用nhw32.dll 应该能实现的吧望做过的会的老大们指点指点啊
      

  4.   

    很早之前了解了下 用C++写的 HOOK API,比如 TextOut...系列函数
      

  5.   

    我刚才试了一下... 一切正常...
    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();
            }
        }
    }
      

  6.   


    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++源代码, 知道它做了什么事, 你自己类型封送就很简单了.
      

  7.   

    我运行的时候是没有报错,可是我没有取到词,参照网上的c++做的用这个dll应该是可以取到词
    运行后sb跟踪显示值为null Help!!!
      

  8.   

    而且这个dll很有局限性, 只能对付Windows标准控件,  像网页它都是无能为力的.
      

  9.   


    为了测试所取的点有词  我用了一个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();
                }
            }结果没有取到词
      

  10.   

    BL_SetFlag32(1001, this.Handle, Cursor.Position.X, Cursor.Position.Y); 
    这样也不行 。
      

  11.   

    这样是不行的. 这个dll性能很差.就算是在C++源代码中, 作者也是等待0.2秒以后才去检查缓冲区有没有词.再加上用C#去调用这个Dll, 由于这个dll涉及到系统Hook, 因此性能和稳定性都非常差.在我的机器上, 基本上要1秒以后再去检查缓冲区, 才有词, 而且不是每次都能取到.你那样马上检查, 注定是取不到词的.需要与系统底层交互的东西, C#不适合, 这是事实.另外这个dll是开源的, 有问题你首先应该尝试自己阅读它的代码, 看它做了什么.
      

  12.   

    谢谢楼上的//在我的机器上, 基本上要1秒以后再去检查缓冲区, 才有词, 而且不是每次都能取到. 
    你是用的c#来调用这个dll还是用的其他语言啊 ?有没有其他好的办法能实现屏幕定点的取词(useing c#) ?感谢
      

  13.   

    非常感谢 shrinerain 
      

  14.   

    当然是C#, 你这个问题不是C#屏幕取词么?如果你想用C++, 那其实更方便, 别人的源代码本来就是C++的
      

  15.   

    你就用我上面那段代码就可以了.后面的100,100表示你要取词的坐标点.
    BL_SetFlag32(1001, IntPtr.Zero, 100, 100);RECT初始化大小是无所谓的, 这个是在dll会修改.你首先确定某个坐标点有词, 然后在调试模式下, 一步一步跟, 别太快. 另外, 最好把鼠标放在那个点上不要动.
      

  16.   

    我跟踪后发现每次一运行 BL_GetText32(sb, bufSize, ref rect);
    原先的rect的height width 等全部都被修改成了 0
    还是取不到值
    不会是dll的问题吧可以的话能不能发你的dll我试一下
    [email protected]
      

  17.   

    我手上现在都有三个版本的nhm32.dll
    一个196k  一个128k  还有一个44k
    现在我用128k的这个来取的时候
    rect不再是0了
    不过还是取不到值sb一直是空的
      

  18.   

    结贴了  虽然还是取不到词 
    谢谢shrinerain 及大家
      

  19.   

    请问老大:是否能提供一个ndw32.dll呢?多谢。