Imports?System.Text
Imports?System.Runtime.InteropServices
Public?Class?Form1
'?相关API函数声明,注释掉的这里没用到,但是也比较常用吧,这些函数的功能都能搜到.
Private?Delegate?Function?EnumChildProc(ByVal?hWnd?As?IntPtr,?ByVal?lParam?As?Integer)?As?Boolean
'?相关消息定义,也有没用到的
Const?WM_SETTEXT?=?HC
Const?WM_GETTEXT?=?HD
'Const?WM_CLOSE?=?H10
Const?BM_GETCHECK?=?HF0
Const?BM_SETCHECK?=?HF1
Const?BST_UNCHECKED?=?O0
Const?BST_CHECKED?=?O1
'?储存窗口句柄
Dim?WindowHandle?As?IntPtr
Dim?EditHandle?As?New?List(Of?IntPtr)
Dim?EditWindowsText?As?List(Of?String)
'?储存复选框句柄
Dim?CheckHandle?As?IntPtr?=?0
Private?Sub?Form1_Load(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?MyBase.Load
Button1_Click(sender,?e)
End?Sub
'?EnumChildWindows?回调函数,该函数名作为API函数EnumChildWindows?的一个参数
Public?Function?EnumChildProcC(ByVal?hwnd?As?IntPtr,?ByVal?lParam?As?Integer)?As?Boolean
Dim?dwWindowClass?As?StringBuilder?=?New?StringBuilder(100)
'?获得某一个句柄的类名
GetClassName(hwnd,?dwWindowClass,?100)
EditHandle.Add(hwnd)????'?存储该句柄
End?If
'?返回?True?一直枚举完
Return?True
End?Function
Private?Sub?Button1_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?Button1.Click
WindowHandle?=?FindWindow(vbNullString,?"登陆")
MsgBox("未捕获到窗口"?◆?"登陆")
Return
EnumChildWindows(WindowHandle,?AddressOf?EnumChildProcC,?0)
'?寻找复选框
CheckHandle?=?FindWindowEx(WindowHandle,?IntPtr.Zero,?vbNullString,?"记住密码")
Dim?str?As?New?StringBuilder
Dim?j?As?Integer?=?0
For?j?=?0?To?EditHandle.Count?-?1
SendMessage(EditHandle(j),?WM_SETTEXT,?0,?"Text")
'EditWindowsText.Add(Str.ToString)
'Str.Clear()
Next
If?EditHandle.Count?=?0?Then
MsgBox("未找到输入框!")
End?If??
'CheckDlgButton(WindowHandle,?id,?1)
'?对复选框进行鼠标单击操作
SendMessage(CheckHandle,?BM_CLICK,?0,?0)
'SendMessage(CheckHandle,?BM_SETCHECK,?True,?0)
End?Class
参考方法如下,具体解释已经注解在代码中;
/定义变量
static int hKeyboardHook = 0;
HookProc KeyboardHookProcedure;
/*************************
* 声明API函数
* ***********************/
// 安装钩子 (using System.Runtime.InteropServices;)
public static extern int SetWindowsHookEx(int idHook,HookProc lpfn, IntPtr hInstance, int threadId);
// 卸载钩子
public static extern bool UnhookWindowsHookEx(int idHook);
// 继续下一个钩子
// 取得当前线程编号(线程钩子需要用到)
static extern int GetCurrentThreadId();
//钩子子程:就是钩子所要做的事情
{
if (nCode = 0)
/****************
//线程键盘钩子判断是否按下键
Keys keyData = (Keys)wParam;
// 键盘按下
}
// 键盘抬起
****************/
//全局键盘钩子判断是否按下键
wParam = = 0x100 // 键盘按下
wParam = = 0x101 // 键盘抬起
KeyMSG m = (KeyMSG) Marshal.PtrToStructure(lParam, typeof(KeyMSG));//键盘
// 今天这一节添加你想要做是事情(比如把键盘nCode记录下来,搞个邮件发送程序发到自己的邮箱去)
return 0;//如果返回1,则结束消息,这个消息到此为止,不再传递.如果返回0或调用CallNextHookEx函数则消息出了这个钩子继续往下传递,也就是传给消息真正的接受者
return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
//键盘结构
public struct KeyMSG
public int vkCode; //键值
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
// 安装钩子
public void HookStart()
if(hKeyboardHook == 0)
// 创建HookProc实例
KeyboardHookProcedure = new HookProc(KeyboardHookProc);
// 设置线程钩子
//************************************
//键盘线程钩子
//键盘全局钩子,需要引用空间(using System.Reflection;)
//
//关于SetWindowsHookEx (int idHook, HookProc lpfn, IntPtr hInstance, int threadId)函数将钩子加入到钩子链表中,说明一下四个参数:
//lpfn 钩子子程的地址指针.如果dwThreadId参数为0 或是一个由别的进程创建的线程的标识,lpfn必须指向DLL中的钩子子程. 除此以外,lpfn可
//以指向当前进程的一段钩子子程代码.钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数.
//hInstance应用程序实例的句柄.标识包含lpfn所指的子程的DLL.如果threadId 标识当前进程创建的一个线程,而且子程代码位于当前
//进程,hInstance必须为NULL.可以很简单的设定其为本应用程序的实例句柄.
//threadedId 与安装的钩子子程相关联的线程的标识符.如果为0,钩子子程与所有的线程关联,即为全局钩子.
// 如果设置钩子失败
if(hKeyboardHook == 0 )
HookStop();
throw new Exception("SetWindowsHookEx failed.");
public void HookStop()
bool retKeyboard = true;
if(hKeyboardHook != 0)
retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
hKeyboardHook = 0;
if (!( retKeyboard))
throw new Exception("UnhookWindowsHookEx failed.");
找到按钮不难,查找input,id是那个按钮的话就用DOM获取到,然后发送.click方法
Visual Basic .NET 中 App 对象的更改
句柄是 Windows 系统中的概念,和VB.NET无关.
通俗地讲,句柄就是一个数字,也就是一个编号.
比如说,你电脑中有10个窗口,每个窗口都会有一个编号,这是操作系统区分各个窗口的依据
可以说下你要干哈吗?
我看了一下这个框框,里面只有一个类名为edit的,也就是你要获取的框框,应该比较简单的,只要你能找到他的爸爸就可以了.
以上就是土嘎嘎小编为大家整理的vb.net输入法句柄相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!