zoukankan
html css js c++ java
c#虚拟键盘、虚拟鼠标以及窗口查找
我想编制一个qq自动登陆程序,确发现C#中对很多api没有封装,只有使用平台调用了。其中用到窗体查找和虚拟键盘、虚拟鼠标等函数。具体代码如下:
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Text;
using
System.Windows.Forms;
using
System.Runtime.InteropServices;
namespace
SimulateMouse
{
public
partial
class
DemoForm : Form
{
[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);
[DllImport(
"
user32.dll
"
)]
static
extern
IntPtr FindWindow(
string
strClass,
string
strWindow);
[DllImport(
"
user32.dll
"
)]
static
extern
IntPtr FindWindowEx(HandleRef hwndParent, HandleRef hwndChildAfter,
string
strClass,
string
strWindow);
[DllImport(
"
user32.dll
"
)]
static
extern
bool
GetWindowRect(HandleRef hwnd,
out
NativeRECT rect);
[DllImport(
"
user32.dll
"
)]
static
extern
void
keybd_event(
byte
bVk,
byte
bScan,
uint
dwFlags,
uint
dwExtraInfo);
private
Point endPosition;
public
DemoForm()
{
InitializeComponent();
}
private
void
button1_Click(
object
sender, EventArgs e)
{
NativeRECT rect;
IntPtr ptrTaskbar
=
FindWindow(
"
#32770
"
,
"
QQ用户登录
"
);
if
(ptrTaskbar
==
IntPtr.Zero)
{
MessageBox.Show(
"
No taskbar found.
"
);
return
;
}
IntPtr ptrStartBtn
=
FindWindowEx(
new
HandleRef(
this
, ptrTaskbar),
new
HandleRef(
this
, IntPtr.Zero),
"
ComboBox
"
,
null
);
if
(ptrStartBtn
==
IntPtr.Zero)
{
MessageBox.Show(
"
No qq号码框 found.
"
);
return
;
}
GetWindowRect(
new
HandleRef(
this
, ptrStartBtn),
out
rect);
endPosition.X
=
(rect.left
+
rect.right)
/
2
;
endPosition.Y
=
(rect.top
+
rect.bottom)
/
2
;
SetCursorPos(endPosition.X, endPosition.Y);
mouse_event(MouseEventFlag.LeftDown,
0
,
0
,
0
, UIntPtr.Zero);
mouse_event(MouseEventFlag.LeftUp,
0
,
0
,
0
, UIntPtr.Zero);
mouse_event(MouseEventFlag.LeftDown,
0
,
0
,
0
, UIntPtr.Zero);
mouse_event(MouseEventFlag.LeftUp,
0
,
0
,
0
, UIntPtr.Zero);
System.IO.StreamWriter tw
=
new
System.IO.StreamWriter(
@"
d:/aa.txt
"
);
tw.Write(
"
49593533
"
);
tw.Close();
System.IO.StreamReader tr
=
new
System.IO.StreamReader(
@"
d:/aa.txt
"
);
String mystr
=
tr.ReadToEnd();
tr.Close();
for
(
int
i
=
0
;i
<
mystr.Length;i
++
)
keybd_event((
byte
)mystr[i],
0
,
0
,
0
);
IntPtr ptrPassWord
=
FindWindowEx(
new
HandleRef(
this
, ptrTaskbar),
new
HandleRef(
this
, IntPtr.Zero),
"
#32770
"
,
null
);
GetWindowRect(
new
HandleRef(
this
, ptrPassWord),
out
rect);
endPosition.X
=
(rect.left
+
rect.right)
/
2
;
endPosition.Y
=
(rect.top
+
rect.bottom)
/
2
;
SetCursorPos(endPosition.X, endPosition.Y);
mouse_event(MouseEventFlag.LeftDown,
0
,
0
,
0
, UIntPtr.Zero);
mouse_event(MouseEventFlag.LeftUp,
0
,
0
,
0
, UIntPtr.Zero);
mouse_event(MouseEventFlag.LeftDown,
0
,
0
,
0
, UIntPtr.Zero);
mouse_event(MouseEventFlag.LeftUp,
0
,
0
,
0
, UIntPtr.Zero);
mystr
=
"
mypassword
"
;
for
(
int
i
=
0
; i
<
mystr.Length; i
++
)
{
keybd_event((
byte
)mystr[i],
0
,
0
,
0
);
}
}
}
}
说明:(
1
)所有虚拟键盘码可以到http:
//
msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/VirtualKeyCodes.asp去查找。
(
2
)首先介绍一下Keybd_event函数。Keybd_event能触发一个按键事件,也就是说回产生一个WM_KEYDOWN或WM_KEYUP消息。当然也可以用产生这两个消息来模拟按键,但是没有直接用这个函数方便。Keybd_event共有四个参数,第一个为按键的虚拟键值,如回车键为vk_return, tab键为vk_tab。第二个参数为扫描码,一般不用设置,用0代替就行第三个参数为选项标志,如果为keydown则置0即可,如果为keyup则设成“KEYEVENTF_KEYUP”或者2,第四个参数一般也是置0即可。
keybd_event(VK_CONTROL, (BYTE)
0
,
0
,
0
);
keybd_event(
'
A
'
,(BYTE)
0
,
0
,
0
);
//
此处可以用 'A', (BYTE)65, 用'a'不起作用.
keybd_event(
'
A
'
, (BYTE)
0
, KEYEVENTF_KEYUP,
0
);
keybd_event(VK_CONTROL, (BYTE)
0
, KEYEVENTF_KEYUP,
0
);
上面的代码表示 ctl
+
a
查看全文
相关阅读:
C#中IEnumerable、ICollection、IList、List之间的区别
H5中画图标签Canvas---画矩形,画线,画圆,渐变色,图形载入
centos启用ftp功能
CentOS 7 安装FTP服务器(vsftpd)
Linux下如何修改用户默认目录
Centos搭建FTP服务器
MyBatis 示例之存储过程
MyBatis:MyBatis操作MySQL存储过程
mybatis的select、insert、update、delete语句
日常运维中的相关日志切割处理方法总结 [Logrotate、python、shell脚本实现 ]
原文地址:https://www.cnblogs.com/kokoliu/p/712193.html
最新文章
WEUI Picker不切换数据
sqlserver2012 offset分页
js scrollIntoView 滚动到元素可视区域
axios 简单常用笔记
用 Fiddler 来弥补 Chrome Network 的小缺点
echarts 认知笔记
css 温故而知新 字体方向 将文字竖着显示
postman 定义并使用全局变量
nodejs 最受欢迎的orm sequelize
postman 脚本学习
热门文章
Vue 温故而知新 props如何双向属性绑定
ElementUI 按需引入坑爹的点记录
详解C# Tuple VS ValueTuple(元组类 VS 值元组)
Jquery和vue对比
AJAX请求真的不安全么?谈谈Web安全与AJAX的关系。
vue实现部分页面导入底部 vue配置公用头部、底部,可控制显示隐藏
vue前端知识点整理
C# Cache缓存读取设置
npm安装教程
浅谈 CSS 预处理器: 为什么要使用预处理器?
Copyright © 2011-2022 走看看