本文來源于網頁設計愛好者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函數里寫上我最開始寫的那段代碼就可以了.