怎么落到实处Excel,Word,Txt切换输出

如题:先描述下要得以完成的效应:依次展开三种文书档案,excel,Word和txt。然后鼠标选中哪个文书档案就输出在哪些文书档案里面,输出数据是和Computer持续的机器中的,机器中的数据输入到Computer,机器上有开关,按下开关就输出到大家选中的文书档案中。然后:已经落到实处:小编用MFC营造了叁个dlg,上面有四个按键,分别对应二种文书档案格式,选中不一致的开关输出到分裂的文书档案中。但是并不曾落到实处最后想要的功能,有以下多少个未缓慢解决的点,希望各位大神帮辅助:1.本人选中分歧文书档案的时候,怎么推断我入选的是哪些文书档案,有如何重临值什么的呢关于率先点,我是想博得分歧格式文书档案窗口的句柄,然后当笔者选中二个文书档案的时候,获取当前窗口的句柄与本人成立的文书档案的句柄实行对照,用来剖断作者当选的是哪一类文书档案窗口。可是笔者找不到Excel的句柄,Findwindow不行.2.关于txt打开着实时刷新的标题那一个自家也找了广大答案,fflush什么的。好像都不可能兑现。有怎么样方法能够解决呢?央浼组织帮助!!!!

打闹程序的操作不外乎三种——键盘输入调整和鼠标输入调整,差不离全数游戏中都接收鼠标来改变剧中人物的职位和动向,本文首如若描述如何使用C#调用Windows API函数达成鼠标模拟操作的功效.首先通过结合FindWindow和FindWindowEx寻觅到窗体的按键,在通过SetCursorPos或mouse_event函数操作鼠标,同期提到到通过spy++工具拿到窗体音信的消息.

后生可畏. Windows API函数介绍

.NET没有提供改换鼠标指针地点、模拟单机操作的函数,然而足以经过调用Windows API函数达成.
[DllImport("user32.dll")]
static extern bool SetCursorPos(int X,int Y);
该函数用于安装鼠标的地点,此中X和Y是相持于显示器左上角的绝对地方.
[DllImport("user32.dll")]
static extern void mouse_event(MouseEventFlag flags,int dx,int dy,uint data,UIntPtr extraInfo);
该函数不只好够安装鼠标指针绝对地方,并且能够以相对坐标来设置地点.
在那之中flags标记位集,内定点击按键和鼠标动作的有余意况.dx指鼠标沿x轴相对地方或上次鼠标事件地点产生以来移动的数量.dy指沿y轴的相对地方或从上次鼠标事件来讲移动的数量.data假诺flags为MOUSE_WHEEL则该值指鼠标轮移动的数码(不然为0卡塔尔国,正值向前转动.extraInfo钦赐与鼠标事件有关的增大叁十四个人值.
[DllImport("user32.dll")]
static extern IntPtr FindWindow(string strClass, string strWindow);
该函数依照类名和窗口名来得到窗口句柄,可是这么些函数无法查找子窗口,也不区分朗朗上口写.假若要从二个窗口的子窗口查找须求使用FIndWindowEX函数.
[DllImport("user32.dll")]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter,
string strClass, string strWindow);
该函数获取二个窗口的句柄,该窗口的类名和窗口名与给定的字符串相相称,该函数查找子窗口时从排在给定的子窗口后边的下三个子窗口初叶.其中参数
hwnParent为要查找子窗口的父窗口句柄,若该值为NULL则函数以桌面窗口为父窗口,查找桌面窗口的保有子窗口.
hwndChildAfter子窗口句柄,查找从在Z序中的下贰个子窗口初步,子窗口必得为hwnParent直接子窗口而非后代窗口,若hwnChildAfter为NULL,查找从父窗口的第二个头窗口开端.
strClass指向一个点名类名的空甘休字符串或八个标志类名字符串的分子的指针.
strWindow指向贰个点名窗口名(窗口标题卡塔尔国的空截止字符串.若为NULL则具有窗体全相称.
再次回到值:借使函数成功,再次来到值为具有钦定类名和窗口名的窗口句柄,假如函数战败,再次来到值为NULL.

二. 鼠标自动点击按键和查看鼠标运转轨迹

先是成立二个C#工程,设计的窗体如下图所示,同不常候增添Timer时间器控件:
图片 1
下一场加上的如下代码,就可以达成鼠标模拟技术及活动操作鼠标:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
//引用新命名空间
using System.Runtime.InteropServices;  //StructLayout

namespace MouseAction
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //结构体布局 本机位置
        [StructLayout(LayoutKind.Sequential)]
        struct NativeRECT
        {
            public int left;
            public int top;
            public int right;
            public int bottom;
        }

        //将枚举作为位域处理
        [Flags]
        enum MouseEventFlag : uint //设置鼠标动作的键值
        {
            Move = 0x0001,               //发生移动
            LeftDown = 0x0002,           //鼠标按下左键
            LeftUp = 0x0004,             //鼠标松开左键
            RightDown = 0x0008,          //鼠标按下右键
            RightUp = 0x0010,            //鼠标松开右键
            MiddleDown = 0x0020,         //鼠标按下中键
            MiddleUp = 0x0040,           //鼠标松开中键
            XDown = 0x0080,
            XUp = 0x0100,
            Wheel = 0x0800,              //鼠标轮被移动
            VirtualDesk = 0x4000,        //虚拟桌面
            Absolute = 0x8000
        }

        //设置鼠标位置
        [DllImport("user32.dll")]
        static extern bool SetCursorPos(int X, int Y);

        //设置鼠标按键和动作
        [DllImport("user32.dll")]
        static extern void mouse_event(MouseEventFlag flags, int dx, int dy,
            uint data, UIntPtr extraInfo); //UIntPtr指针多句柄类型

        [DllImport("user32.dll")]
        static extern IntPtr FindWindow(string strClass, string strWindow);

        //该函数获取一个窗口句柄,该窗口雷鸣和窗口名与给定字符串匹配 hwnParent=Null从桌面窗口查找
        [DllImport("user32.dll")]
        static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter,
            string strClass, string strWindow);

        [DllImport("user32.dll")]
        static extern bool GetWindowRect(HandleRef hwnd, out NativeRECT rect);

        //定义变量
        const int AnimationCount = 80;         
        private Point endPosition;            
        private int count;

        private void button1_Click(object sender, EventArgs e)
        {
            NativeRECT rect;
            //获取主窗体句柄
            IntPtr ptrTaskbar = FindWindow("WindowsForms10.Window.8.app.0.2bf8098_r11_ad1", null);
            if (ptrTaskbar == IntPtr.Zero)
            {
                MessageBox.Show("No windows found!"); 
                return;
            }
            //获取窗体中"button1"按钮
            IntPtr ptrStartBtn = FindWindowEx(ptrTaskbar, IntPtr.Zero, null, "button1");
            if (ptrStartBtn == IntPtr.Zero)
            {
                MessageBox.Show("No button found!");
                return;
            }
            //获取窗体大小
            GetWindowRect(new HandleRef(this, ptrStartBtn), out rect);
            endPosition.X = (rect.left + rect.right) / 2;
            endPosition.Y = (rect.top + rect.bottom) / 2;
            //判断点击按钮
            if (checkBox1.Checked)
            {
                //选择"查看鼠标运行的轨迹"
                this.count = AnimationCount;
                movementTimer.Start();
            }
            else
            {
                SetCursorPos(endPosition.X, endPosition.Y);
                mouse_event(MouseEventFlag.LeftDown, 0, 0, 0, UIntPtr.Zero);
                mouse_event(MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);
                textBox1.Text = String.Format("{0},{1}", MousePosition.X, MousePosition.Y);
            }

        }

        //Tick:定时器,每当经过多少时间发生函数
        private void movementTimer_Tick(object sender, EventArgs e)
        {
            int stepx = (endPosition.X - MousePosition.X) / count;
            int stepy = (endPosition.Y - MousePosition.Y) / count;
            count--;
            if (count == 0)
            {
                movementTimer.Stop();
                mouse_event(MouseEventFlag.LeftDown, 0, 0, 0, UIntPtr.Zero);
                mouse_event(MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);
            }
            textBox1.Text = String.Format("{0},{1}", MousePosition.X, MousePosition.Y);
            mouse_event(MouseEventFlag.Move, stepx, stepy, 0, UIntPtr.Zero);
        }
    }
}

再者自定义叁个会话框,扩充三个button开关,其运营结果如下图所示:
图片 2
能够看出当运路程序勾选"查看鼠标运维的轨道"并点击"初叶"开关后,会经过FindWindow和FindWindowEx函数查找窗体"Form1"的"button1"开关,并透过mouse_event移动鼠标和点击鼠标.当中等学校函授数原型为:

IntPtr FindWindowEx(
    IntPtr hwndParent,     // handle to parent window [父窗体句柄]
    IntPtr hwndChildAfter, // handle to child window [子窗体句柄]
    string strClass,       // class name [窗体类名]
    string strWindow       // window name [窗体名]
);

唯独怎样找到窗体类名和开关的类名呢?由于初学,相当多窗体小编都尚未兑现如QQ,它须求利用多少个叫spy++的工具.
PS:第一遍成立gif格式动态图表,参照博客