首页 > 开发 > 综合 > 正文

C#实现查看文本框(如*号密码框)

2024-07-21 02:19:31
字体:
来源:转载
供稿:网友
  • 本文来源于网页设计爱好者web开发社区http://www.html.org.cn收集整理,欢迎访问。
  • 今天闲着无聊,试着用c#写查看密码框的程序(不仅限于密码框,应该是任何有文本的控件都可以)
    代码见下面.
    用c++实现起来超简单的这么个东东..用c#复杂得很,我又不想用unsafe,我总觉得用unsafe的话,干嘛不干脆用c++算了.

    int length=300;
    intptr thandle=apis.getlocalwindow();//取得当前鼠标所在位置的控件句柄
    int address=apis.virtualallocex(process.getcurrentprocess().handle,0,length,0x1000,0x04);//在本进程内分配length大小的内存
    apis.sendmessage(thandle,0x000d,new intptr(255),new intptr(address));//发送消息到目标控件,0x000d就是wm_gettext,255的意思是保存返回的值,new intptr(address)是指保存到address指定的地址
    byte[] buf=new byte[length];
    apis.readprocessmemory(process.getcurrentprocess().handle,address,buf,length,0);//读取刚才保存的内容
    messagebox.show(encoding.default.getstring(buf));//显示出来测试一下.

    其中apis开头的,是我自己写的api类库,相关声明如下:
    [dllimport("user32.dll")]
    public static extern intptr windowfrompoint(
    point lppoint
    );

    [dllimport("user32.dll")]
    public static extern int getcursorpos(
    out point lppoint
    );
    public static intptr getlocalwindow()//这个只是把上两个结合了一下
    {
    point point;
    getcursorpos(out point);
    return windowfrompoint(point);
    }

    //不加ex的话.上面就不用第一个handle参数了
    [ dllimport( "kernel32.dll" )]
    public static extern system.int32 virtualallocex(
    system.intptr hprocess,
    system.int32 lpaddress,
    system.int32 dwsize,
    system.int16 flallocationtype,
    system.int16 flprotect
    );

    [dllimport("user32.dll")]
    public static extern intptr sendmessage(
    intptr hwnd,
    int msg,
    intptr wparam,
    intptr lparam
    );

    [ dllimport( "kernel32.dll" )]
    public static extern int readprocessmemory(
    system.intptr hprocess,
    system.int32 lpbaseaddress,
    byte[] lpbuffer,
    long nsize,
    long lpnumberofbyteswritten
    );


    *******************************************************************
    因为一般要查看的是外部程序,配合快捷键不失不一种好方法.
    c#的实现如下:
    在初始化窗口的代码里加上
    keymodifiers modifiers=keymodifiers.windows;//定义为win+快捷键,也可定义为别的.
    registerhotkey(handle, 1001,modifiers,keys.v);//给win+v分配id为1001

    override一下wndproc
    protected override void wndproc( ref message m )
    {
    const int wm_hotkey = 0x0312;
    switch(m.msg)
    {
    case wm_hotkey:
    switch (m.wparam.toint32())
    {
    case 1001:
    onhotkeyv();
    break;
    default:break;
    }
    break;
    }
    base.wndproc(ref m );
    }
    在onhotkeyv函数里写上我最开始写的那段代码就可以了.
    发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表