c#进程操作-sendmessage全解

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Drawing;
namespace util
{
    public class Sendmessage1
    {
        [DllImport("user32.dll", EntryPoint = "SendMessageA")]
        public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
        public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, IntPtr lParam);
        public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
        public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, StringBuilder lParam);
        public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, string lParam);
        public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, ref Rectangle lParam);
        public static extern IntPtr SendMessage(IntPtr hwnd, uint wMsg, uint wParam, uint lParam);
        public static extern IntPtr SendMessage(IntPtr hwnd, int wMsg, bool wParam, int lParam);
        [DllImport("user32.dll")]
	    public static extern IntPtr GetForegroundWindow();

        //键盘按下(目标窗体也许并不接受)
        public static int WM_KEYDOWN = 0x0100;
        public static int WM_KEYUP = 0x0101;

        //移动鼠标时发生,同WM_MOUSEFIRST
        public static int WM_MOUSEMOVE = 0x200;
        //按下鼠标左键
        public static int WM_LBUTTONDOWN = 0x201;
        //释放鼠标左键
        public static int WM_LBUTTONUP = 0x202;
        //双击鼠标左键
        public static int WM_LBUTTONDBLCLK = 0x203;
        //按下鼠标右键
        public static int WM_RBUTTONDOWN = 0x204;
        //释放鼠标右键
        public static int WM_RBUTTONUP = 0x205;
        //双击鼠标右键
        public static int WM_RBUTTONDBLCLK = 0x206;
        //按下鼠标中键
        public static int WM_MBUTTONDOWN = 0x207;
        //双击鼠标中键
        public static int WM_MBUTTONDBLCLK = 0x209;
        //释放鼠标中键
        public static int WM_MBUTTONUP = 0x208;
        //发送字符
        public static int WM_CHAR = 0x102;
        //发送文本
        public static int WM_SETTEXT = 0x0C;
        //获取文本
        public static int WM_GETTEXT = 0x0D;
        //获取形状
        public static int EM_GETRECT = 0xB2;
        //获取文本行数
        public static int EM_GETLINECOUNT = 0xBA;
        //获得文本是否被修改过
        public static int EM_GETMODIFY = 0xB8;
        //获得光标在文本第几行
        public static int EM_LINEFROMCHAR = 0xC9;
        //获得多行文本编辑控件的滚动框的当前位置(像素值)
        public static int EM_GETTHUMB = 0xBE;
        //滚动到文本指定行列
        public static int EM_LINESCROLL = 0xB6;
        //获得文本光标处之前的字符数,包括回车换行 
        public static int EM_LINEINDEX = 0xBB;
        //限制文本长度
        public static int EM_LIMITTEXT = 0xC5;
        //撤销操作,可撤销很多次
        public static int EM_UNDO = 0xC7;
        //设定只读
        public static int EM_SETREADONLY = 0xCF;
        //控件获得焦点
        public static int WM_SETFOCUS = 0x07;
        //控件失去焦点
        public static int WM_KILLFOCUS = 0x08;
        //滚动
        public static int EM_SCROLL = 0xB5;
        //选取指定范围字符串(要先获得焦点)
        public static int EM_SETSEL = 0xB1;


        //发送键盘点击事件
        public static void keyclick(IntPtr handle, int charcode)
        {
            SendMessage(handle, WM_KEYDOWN, charcode, IntPtr.Zero);
            SendMessage(handle, WM_KEYUP, charcode, IntPtr.Zero);
        }
        //模拟鼠标点击
        public static void mouseclick(IntPtr handle)
        {
            SendMessage(handle, WM_LBUTTONDOWN, 0,0);
            SendMessage(handle, WM_LBUTTONUP, 0,0);
        }
        //模拟鼠标点击指定位置
        public static void mouseclick(IntPtr handle,int x,int y)
        {
            SendMessage(handle, WM_LBUTTONDOWN, 0, y*65536+x);
            SendMessage(handle, WM_LBUTTONUP, 0, y * 65536 + x);
        }

        //发送字符
        public static void sendchar(IntPtr handle, int charcode)  //发送A字符为65
        {
            SendMessage(handle, WM_CHAR, (IntPtr)charcode, IntPtr.Zero);
        }
        //发送文本
        public static void settext(IntPtr handle, String s) 
        {
            SendMessage(handle, WM_SETTEXT, IntPtr.Zero, s);
        }

        //获取文本
        public static String gettext(IntPtr handle)
        {
            const int buffer_size = 1024;
            StringBuilder buffer = new StringBuilder(buffer_size);
            SendMessage(handle, WM_GETTEXT, buffer_size, buffer);
            return buffer.ToString();
        }  
        //获取形状
        public static Size getrect(IntPtr handle)
        {
            Rectangle rect1 = new Rectangle();
            SendMessage(handle, EM_GETRECT, (IntPtr)0, ref rect1);
            Size size = new Size(rect1.Width, rect1.Height);
            return size;
        }     
        //获取文本行数
        public static int getlinecount(IntPtr handle)
        {
            int linenum = SendMessage(handle, EM_GETLINECOUNT, 0, 0);
            return linenum;
        }
        //获得文本是否被修改过
        public static bool getmodify(IntPtr handle)
        {
            int 是否修改过 = SendMessage(handle, EM_GETMODIFY, 0, 0);
            if (是否修改过 == 0)
                return false;
            else
                return true;
        }          
        //获得光标在文本第几行
        public static int linefromchar(IntPtr handle)
        {
            int 光标在第几行 = SendMessage(handle, EM_LINEFROMCHAR, -1, 0);
            return 光标在第几行;   //下标从0开始
        }
        //获得多行文本编辑控件的滚动框的当前位置(像素值)
        public static int getthumb(IntPtr handle)
        {
            int rc = SendMessage(handle, EM_GETTHUMB, 0, 0);
            return rc;   //下标从0开始
        }
        //滚动到文本指定行列
        public static void linescroll(IntPtr handle,int row,int column)
        {
            SendMessage(handle, EM_LINESCROLL, column, row);
        }
        //获得文本光标处之前的字符数,包括回车换行 
        public static int lineindex(IntPtr handle)
        {
            int 第一个字母前的字符数 = SendMessage(handle, EM_LINEINDEX, -1, 0);
            return 第一个字母前的字符数;
        }
        //限制文本可输入长度
        public static void limittext(IntPtr handle,int maxnum)
        {
            SendMessage(handle, EM_LIMITTEXT, maxnum, 0);
        }
        //撤销操作,可撤销很多次
        public static void undo(IntPtr handle)
        {
            SendMessage(handle, EM_UNDO, 0, 0);
        }
        //设定只读
        public static void serreadonly(IntPtr handle)
        {
            SendMessage(handle, EM_SETREADONLY, true, 0);
        }
        //控件获得焦点
        public static void setfocus(IntPtr handle)
        {
            SendMessage(handle, WM_SETFOCUS, 0, 0);
        }
        //控件失去焦点
        public static void killfocus(IntPtr handle)
        {
            SendMessage(handle, WM_KILLFOCUS, 0, 0);
        }
        //滚动
        public static void scroll(IntPtr handle)
        {
            SendMessage(handle, EM_SCROLL, 3, 0);//滚动到下一页
            SendMessage(handle, EM_SCROLL, 2, 0);//滚动到上一页
            SendMessage(handle, EM_SCROLL, 1, 0);//滚动到下一行
            SendMessage(handle, EM_SCROLL, 0, 0);//滚动到上一行
        }
        //选取指定范围字符串(要先获得焦点)
        public static void setsel(IntPtr handle,int begin,int end)
        {
            SendMessage(handle, WM_SETFOCUS, 0, 0);
            SendMessage(handle, EM_SETSEL, begin, end);
        }

//        用 InPtr 类型统一处理
//        [DllImport("user32.dll", EntryPoint = "SendMessageA")]
//        private static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
//        public static int EM_GETRECT = 0xB2;
//调用1
//            Rectangle rect1 = new Rectangle();
//            IntPtr buffer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Rectangle)));
//            Marshal.StructureToPtr(rect1, buffer, true);
//            SendMessage(this.richTextBox1.Handle, EM_GETRECT, (IntPtr)0, buffer);
//            rect1 = (Rectangle)Marshal.PtrToStructure(buffer, typeof(Rectangle));
//            Marshal.FreeHGlobal(buffer);
//            button1.Size = new Size(rect1.Width, rect1.Height);
//调用2
//            Rectangle rect = new Rectangle();
//            GCHandle gch = GCHandle.Alloc(rect);
//            SendMessage(this.richTextBox1.Handle, EM_GETRECT, (IntPtr)0, (IntPtr)gch);
//            rect = (Rectangle)Marshal.PtrToStructure((IntPtr)gch, typeof(Rectangle));
//            button1.Size = new Size(rect.Width, rect.Height);
//            gch.Free();


        //调节音量
        const uint WM_APPCOMMAND = 0x319;
        const uint APPCOMMAND_VOLUME_UP = 0x0a;
        const uint APPCOMMAND_VOLUME_DOWN = 0x09;
        const uint APPCOMMAND_VOLUME_MUTE = 0x08;
        public static void volume(IntPtr handle)
        {
            SendMessage(handle, WM_APPCOMMAND, 0x30292, APPCOMMAND_VOLUME_UP * 0x10000);//调高音量
            SendMessage(handle, WM_APPCOMMAND, 0x30292, APPCOMMAND_VOLUME_DOWN * 0x10000);//降低音量
        }


    }
}

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

腾讯AI架构师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值