控制其他程序1(金山词霸2009)

基于个人需要,想控制其他程序,获取其他程序接运行结果。

具体来说,现在我想要在我的程序中控制金山词霸查询一个单词,最后能在我的程序中显示查询的结果。

就像把其他程序作为一个函数来调用,首先想到的是发送消息。

需要做到的有

1. 填入要查询的的单词

2. 单词“查词”按钮

3. 获取查询的结果并显示在程序中

前两步很容易做到,获取相应的控件的句柄,然后发送相应的消息就行了。

具体用到了

/// <summary>

/// 获取子窗体

/// </summary>

private void GetChildren()

{

Children.Clear();

IntPtr hwnd = IntPtr.Zero;

hwnd = User32.FindWindowEx(Wnd, hwnd, null, null);

while (hwnd != IntPtr.Zero)

{

WindowInfo child = new WindowInfo(hwnd, this);

Children.Add(child);

hwnd = User32.FindWindowEx(Wnd, hwnd, null, null);

}

}

/// <summary>

/// 设置文本

/// </summary>

/// <param name="text"></param>

public void SetText(string text)

{

//User32.SetWindowText(Wnd, text);

//下面这个能够设置Edit,上面则不行

User32.SendMessage(Wnd, Constant_WM.WM_SETTEXT, IntPtr.Zero, text);

}

/// <summary>

/// 单击按钮

/// </summary>

public void ButtonClick()

{

User32.SendMessage(Wnd, Constant_BM.BM_CLICK, IntPtr.Zero, "0");

}

为了处理上方便,写了个WindowInfo类,封装了句柄相关的信息,内部还有个Children,形成了一个控件树,便于获取子控件。

(User32是一个封装了User32.dll里面的API函数的静态类)

获取界面上的主要控件:

protected override void GetInfo()

{

base.GetInfo();

GetBtnSearch();

TxtInput = Window.GetChildByClass("Edit");

TxtResult = Window.GetChildByClass("Internet Explorer_Server");

}

public WindowInfo TxtInput { get; set; }

public WindowInfo BtnSearch { get; set; }

public WindowInfo TxtResult { get; set; }

private void GetBtnSearch()

{

foreach (WindowInfo child in Window.Children)

{

if (child.Width == 59 && child.Height == 29)

{

BtnSearch = child;

}

}

}

第三步比较麻烦,是一个Internet Explorer_Server类型的控件。

幸亏网上直接有解决方案,他们的目的是要控制IE里面的内容,我只需要获取内容,再把内容给一个WebBrowser控件就行了。

整理了一下,做成一个静态类了HtmlDocumentHelper(代码在最后),需要引用COM里面的“Microsoft HTML Object Library”。

最后就完成了一个XDict类,应该算是一种代理吧,用它来间接控制金山词霸。

public class XDict : ThirdTool

    {

        public XDict()

        {

            Name = "XDict";

            Path = ConfigurationManager.AppSettings["XDictPath"];

            //Init();

        }

 

        protected override void GetInfo()

        {

            base.GetInfo();

            GetBtnSearch();

            TxtInput = Window.GetChildByClass("Edit");

            TxtResult = Window.GetChildByClass("Internet Explorer_Server");

        }

 

        public WindowInfo TxtInput { get; set; }

        public WindowInfo BtnSearch { get; set; }

        public WindowInfo TxtResult { get; set; }

 

        private void GetBtnSearch()

        {

            foreach (WindowInfo child in Window.Children)

            {

                if (child.Width == 59 && child.Height == 29)

                {

                    BtnSearch = child;

                }

            }

        }

 

        public string Search(string word,bool getResult=true)

        {

            if (Process == null) return null;

            string html = "";

            if (TxtInput == null) GetInfo(); 

            if (TxtInput == null) return null;

            TxtInput.SetText(word);

            if (BtnSearch == null) GetBtnSearch();

            if (BtnSearch == null) return null;

            BtnSearch.ButtonClick();

            if (getResult)

            {

                html = HtmlDocumentHelper.GetHtml(TxtResult.Wnd);

            }

            return html;

        }

    }

ThirdTool是负责打开程序,获取程序句柄等通用功能的类,实际上现在已经在写其他程序的代理类了。

这个技术完善的话还是比较通用的:自己做不到的,首先找开源,开源的没有或无法满足的则直接控件已有该功能的软件。嘛,估计上不了大雅之堂,只能个人玩玩。

不知道有没有这种的完善的框架了,先自己研究下,以后再找找看。

HtmlDocumentHelper:

public static class HtmlDocumentHelper

{

public const int SMTO_ABORTIFHUNG = 0x2;

public static Guid IID_IHTMLDocument = new Guid("626FC520-A41E-11CF-A731-00A0C9082637");

[DllImport("OLEACC.dll")]

public static extern int ObjectFromLresult(int lResult, ref Guid riid, int wParam, ref IHTMLDocument2 ppvObject);

public static IHTMLDocument2 GetIEDocument()

{

Process[] processes = Process.GetProcessesByName("iexplore");

IntPtr hWnd = IntPtr.Zero;

if (processes.Length > 1)

{

foreach (Process process in processes)

{

if (process.MainWindowTitle != "")

{

hWnd = process.MainWindowHandle;

}

}

}

return HtmlDocumentHelper.GetDocument(hWnd);

}

public static IHTMLDocument2 GetDocument(IntPtr hWnd)

{

IHTMLDocument2 document=new HTMLDocumentClass();

if (hWnd != IntPtr.Zero)

{

//IntPtr hWnd = processes[2].MainWindowHandle;

int lngMsg = 0;

int lRes = 0;

User32.EnumProc proc = new User32.EnumProc(EnumWindows);

User32.EnumChildWindows(hWnd, proc, ref hWnd);

if (!hWnd.Equals(IntPtr.Zero))

{

lngMsg = User32.RegisterWindowMessage("WM_HTML_GETOBJECT");

if (lngMsg != 0)

{

User32.SendMessageTimeout(hWnd, lngMsg, 0, 0, SMTO_ABORTIFHUNG, 1000, ref lRes);

if (!(bool)(lRes == 0))

{

int hr = ObjectFromLresult(lRes, ref IID_IHTMLDocument, 0, ref document);

if ((bool)(document == null))

{

//MessageBox.Show("No IHTMLDocument Found!", "Warning");

}

}

}

}

}

return document;

}

public static string GetHtml(IntPtr hWnd)

{

IHTMLDocument2 document = GetDocument(hWnd);

return GetHtml(document);

}

public static string GetHtml(IHTMLDocument2 document)

{

string text = "";

foreach (IHTMLElement element in document.all)

{

text += element.innerHTML;

}

return text;

}

private static int EnumWindows(IntPtr hWnd, ref IntPtr lParam)

{

int retVal = 1;

StringBuilder classname = new StringBuilder(128);

User32.GetClassName(hWnd, classname, classname.Capacity);

/// check if the instance we have found is Internet Explorer_Server

if ((bool)(string.Compare(classname.ToString(), "Internet Explorer_Server") == 0))

{

lParam = hWnd;

retVal = 0;

}

return retVal;

}

}

时间: 2024-10-02 09:20:54

控制其他程序1(金山词霸2009)的相关文章

如何控制其他程序窗体上的窗口控件

用我的方法来控制其他程序窗体上的窗口控件,必须先了解什么是回调函数.我的理解是这样的:回调函数写出来不是自己的程序去调用的,反而是让其他的东西去调用,比如windows操作系统,比如其他的程序等等之类的.但是什么时候被调用却不知道了.回调函数一般是按照调用者的要求定义好参数和返回值的类型,你向调用者提供你的回调函数的入口地址,然后调用者有什么事件发生的时候就可以随时按照你提供的地址调用这个函数通知你,并按照预先规定好的形式传递参数.所以很多人打比方,说回调函数还真有点像您随身带的BP机:告诉别人

vb代码之------FindWindow and FindWindowEx控制其他程序

应该有不少童鞋都喜欢用自己的程序来控制其他程序吧,但是又恨自己技术浅,那么今天给大家带来一个简单的vb控制器 在此之前,我想说一下句柄 对于Win32程序员来说,如果不知道句柄,那么也太逊了吧,那句柄是什么呢?百度百科是这样说的 "个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类中的不同的实例" 首先,你可以知道句柄是一个整数,这个不难理解吧,还有是用来标识应用程序的实例,也就是一个整数标识了一个应用程序.在操作系统中,每

推荐下载使用:金山词霸2009官方牛津版 + 破解补丁

2008-03-29 09:04 推荐下载使用:金山词霸2009官方牛津版 + 破解补丁 <金山词霸2009牛津版>收词总量 5,000,000,例句 2,000,000余条,涉及语种包括中.日.英.韩.德.法.俄.收纳98个行业词汇等权威词库. 金山词霸2009牛津版下载: http://download.iciba.com/Pw2009_oxf/Powerword2009Oxf.25269.4011.exe 金山词霸2009牛津版破解补丁下载: 打开我的网络硬盘 安装及破解补丁使用方法:

cmd(控制命令程序)的用法

1. win+r进入运行程序,cmd进入控制命令界面 dir显示目录下包含的子目录或文件 用法: dir是路径 dir是命令,在命令后空格分开 路径:要显示目录的位置 rd:删除空目录 语法: rd  路径\目录的名称 cd: 切换路径 语法: 1      cd目录x              //切换到当前目录下的"目录x" 2      cd路径\目录x         //切换到指定"目录x" 3      cd..                 //切换

进程控制扩展 程序执行 程序执行 函数

<?php //Resource Limits 名字 默认 可修改范围 更新日志 //memory_limit "128M" PHP_INI_ALL "8M" before PHP 5.2.0, "16M" in PHP 5.2.0 //echo memory_get_peak_usage();//返回分配给 PHP 内存的峰值 //echo "<br>"; //echo memory_get_usage()

WinForm开发控制应用程序自启动功能

本文主要讲述WinForm开发应用程序需要设置自启动功能,这个也是在实际开发中经常涉及到的,非常实用,所讲到的是通过注册表来控制程序是否自行启动,具体功能实现上两张图,更直观. 如下图: 程序设置保持界面实现代码 using Microsoft.Win32; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; us

C#控制其它程序

[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]        private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", EntryPoint = "FindWindowEx"

通过线程控制python程序运行一定时间

<span style="font-family: Arial, Helvetica, sans-serif;">import time</span> class Test(threading.Thread): def __init__(self, para): #初始化参数 threading.Thread.__init__(self) self.para= para def run(self): while(True): doMail(self.para)#

51单片机对无线模块nRF24L01简单的控制收发程序

它的一些物理特性如工作频段.供电电压.数据传输速率就不详细介绍了,直接上代码. 1.首先是发送端: // Define SPI pins #include <reg51.h> #define uchar unsigned char /***************************************************/ #define TX_ADR_WIDTH 5 // 5字节宽度的发送/接收地址 #define TX_PLOAD_WIDTH 4 // 数据通道有效数据宽度