我想要实现的功能是:
我在使用另外一个应用程序A,A程序我没有源码,A程序中有一个【提交案例】的按钮,我会经常点他我想开发一个小工具,能获取到点击【提交案例】按钮的动作,从而自动记录,点击了多少次。请问高手C#.net怎么实现啊?

解决方案 »

  1.   

    socket 点击一下按钮,发送一条消息到服务端
      

  2.   

    用api找到那个按钮FindWindow、FindWindowEx 这两个api函数应该可以
      

  3.   

    通过FindWindow,我找到了这个进程按钮的句柄,能定位到这个按钮,sendmessage可以对按钮操作,可是我想监控该进程,当点击按钮时,自动在后台触发计数的功能,该如何实现呢?
      

  4.   

    js 结合ajax实现应该没问题 
      

  5.   

    这是我现在的方法,遇到了困难,我用findwindow和FindWindowEx 找到了计算机的“=”号按钮,如何监控他被点击啊?[DllImport("User32.dll ", EntryPoint = "FindWindow")]
    private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    [DllImport("user32.dll ", EntryPoint = "FindWindowEx")]
    private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
    [DllImport("User32.dll ", EntryPoint = "SendMessage")]
    private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam);private void button1_Click(object sender, EventArgs e)
    {
                string lpszParentClass = "SciCalc";   //整个窗口的类名             string lpszParentWindow = "计算器";   //窗口标题             string lpszClass_Submit = "Button";   //需要查找的Button的类名             string lpszName_Submit = "=";  //需要查找的Button的标题            IntPtr   ParenthWnd   =   new   IntPtr(0);             IntPtr   EdithWnd   =   new   IntPtr(0);            const int WM_CLICK = 0x00F5;             ParenthWnd   =   FindWindow(lpszParentClass,lpszParentWindow);             if   (!ParenthWnd.Equals(IntPtr.Zero))             { 
                    EdithWnd   =  FindWindowEx(ParenthWnd,EdithWnd,lpszClass_Submit,lpszName_Submit);                 if(!EdithWnd.Equals(IntPtr.Zero))                 {                      int i = 0 ;
                         if(监控“=”号按钮被点击时)
                         {   i=i+1   }
                    }            }        }
      

  6.   

    要做完这个要涉及很广的东西滴.做游戏外挂就经常做这些事.如果为了监控网络操作,用别的工具拦截就可以了(wpe).如果是为了检测数据操作,mssql和orcal 都有工具检测.如果为了拦截函数那就需要改它的执行文件.(如果文件加有壳).那就脱壳.脱壳壳就可以注入dll需要拦截程序进程,把你要拦截的函数的后面几个字节 jmp XXXXXXXX 候跳转到自己的dll那里,把参数都记录下来然后跳回去 . 这是针对 c++ delphi 等等的exe.如果是.net的又另外处理咯.
      

  7.   

    上面有错误,就是脱壳是为了修改exe文件. 不脱壳也可以注入.
      

  8.   

    朋友 推荐 了个图形化的 编程工具 7行代码就实现这个功能 了,可惜无法导入到我的.net源文件里,还是期待能有解决的详细方法。
      

  9.   

    如果只是单纯的想获取点击次数的话,可以考虑用WIN32按坐标点击指定位置,记录次数。如果提交需要时间,可以用线程.
      

  10.   

    windows是消息驱动的。c#是事件驱动的。不是任意的程序都有类似的事件机制。对没有代码的,模拟点击或选择对应的按钮(api:setfocus),然后发送回车键比较靠谱。否则,你需要确认另一个程序的确是用.net开发的,你可以考虑找到窗体句柄后Form.FromHandle创建引用,然后使用反射。
      

  11.   

    估计比较难弄,如果是有源代码,可以修改一下实现你的需要,建议:
    1、你可以使用reflector去试着反编译这个程序,看看是否可以得到源码,如果改程序也是.net编写的,又没有被混淆过,应该可以得到大部分源码。2、你可以这样修改源码,获得你要的效果:
    参考自博客:http://www.cnblogs.com/michaelhuwei/archive/2007/06/15/784266.html
    先定义一个消息过滤器
        /// <summary>
        /// 自定义的消息过滤器,必须实现 IMessageFilter 接口
        /// </summary>
        class myFilter : IMessageFilter
        {
            const int WM_LBUTTONDOWN = 0x0201;
            public bool PreFilterMessage(ref Message m)
            {
                if (m.Msg == WM_LBUTTONDOWN)
                {
                    Console.WriteLine(Control.FromHandle(m.HWnd).Name);
                }
                return false;
            }
        }
    在Form中添加该过滤器
            private void Form1_Load(object sender, EventArgs e)
            {
                //为窗体添加消息过滤器
                Application.AddMessageFilter(new myFilter());
            }
    注:msdn 上明确注明,AddMessageFilter 会让系统性能下降,估计其低层是用 SetWindowsHook之类的API.
      

  12.   

    注:msdn 上明确注明,AddMessageFilter 会让系统性能下降,估计其低层是用 SetWindowsHook之类的API.我估计效率影响比较明显,原因是操作系统是消息驱动的,消息会非常多,多一个IMessageFilter的方法调用,就要每次多创建堆栈,多一层调用。这个时间不长,但每秒都有很多消息,效率影响就不能忽视了。而这个是插在线程消息循环的,不是某个窗体的,所以过滤的比较多。
      

  13.   

    非要这么做么?这不是一个很好的解决方案,潜在的问题会很多。方法是设立键盘钩子,C#应用钩子的办法,可参考
    http://blogs.msdn.com/b/toub/archive/2006/05/03/589423.aspx