zoukankan
html css js c++ java
通过Win API 模拟鼠标点击,使C# Java交互 (PART.2 Java部分)
Java部分:
调用:
ArrayList
<
QueueItem
>
li
=
new
ArrayList
<
QueueItem
>
();
li.add(
new
QueueItem(
"
WindowsForms10.Window.8.app3
"
,
"
采集系统
"
));
li.add(
new
QueueItem(
"
WindowsForms10.BUTTON.app3
"
,
"
选项
"
));
int
result
=
NativeWin32.ClickOnWindow(li);
System.
out
.print(result);
PINVOKE封装采用 NativeCall [
http://johannburkard.de/software/nativecall/
]
QueueItem,窗体查找时的节点定义.
public
class
QueueItem
{
public
String ClassName;
public
String WindowCaption;
public
boolean IsParent
=
true
;
public
QueueItem(String className,String windowCaption)
{
ClassName
=
className;
WindowCaption
=
windowCaption;
}
public
QueueItem(String className,String windowCaption,boolean isParent)
{
ClassName
=
className;
WindowCaption
=
windowCaption;
IsParent
=
isParent;
}
}
API
import com.eaio.nativecall.IntCall;
public
class
NativeWin32
{
public
static
Integer FindWindow(String sClassName,String sWindowName)
{
IntCall iCall
=
new
IntCall(
"
user32
"
,
"
FindWindowW
"
);
int
iRet
=
iCall.executeCall(
new
Object[]
{
sClassName,
sWindowName}
);
iCall.destroy();
return
new
Integer(iRet);
}
public
static
Integer FindWindowEx(Integer hwndParent,Integer hwndChildAfter,String sClassName,String sWindowName)
{
IntCall iCall
=
new
IntCall(
"
user32
"
,
"
FindWindowExW
"
);
int
iRet
=
iCall.executeCall(
new
Object[]
{
hwndParent,
hwndChildAfter,
sClassName,
sWindowName}
);
iCall.destroy();
return
new
Integer(iRet);
}
private
static
final
int
WM_GETTEXT
=
0x000D
;
private
static
final
int
WM_SETTEXT
=
0x000C
;
private
static
final
int
WM_CLICK
=
0x00F5
;
private
static
final
int
SW_MAXIMIZE
=
3
;
private
static
final
int
SW_SHOWNORMAL
=
1
;
private
static
Integer SendMessage(Integer hwnd,
int
msg,Integer wParam,String lParam)
{
IntCall iCall
=
new
IntCall(
"
user32
"
,
"
SendMessageW
"
);
int
iRet
=
iCall.executeCall(
new
Object[]
{
hwnd,
msg,
wParam,
lParam}
);
iCall.destroy();
return
new
Integer(iRet);
}
public
static
void
SetForegroundWindow(Integer hwnd)
{
IntCall iCall
=
new
IntCall(
"
user32
"
,
"
SetForegroundWindow
"
);
iCall.executeCall(
new
Object[]
{
hwnd}
);
iCall.destroy();
}
public
static
void
ShowWindow(Integer hwnd,
int
size)
{
IntCall iCall
=
new
IntCall(
"
user32
"
,
"
ShowWindow
"
);
iCall.executeCall(
new
Object[]
{
hwnd,
size}
);
iCall.destroy();
}
public
static
int
ClickOnWindow(java.util.ArrayList
<
QueueItem
>
queue)
{
int
result
=
-
1
;
Integer ParenthWnd
=
new
Integer(
0
);
Integer ChildhWnd
=
new
Integer(
0
);
QueueItem q
=
queue.
get
(result
+
1
);
//
查到窗体,得到整个窗体
ParenthWnd
=
FindWindow(q.ClassName,q.WindowCaption);
//
判断这个窗体是否有效
if
(ParenthWnd
!=
0
)
{
ShowWindow(ParenthWnd,SW_SHOWNORMAL);
SetForegroundWindow(ParenthWnd);
//
激活窗体
result
++
;
while
(result
+
1
<
queue.size())
{
q
=
queue.
get
(result
+
1
);
ChildhWnd
=
FindWindowEx(ParenthWnd,
0
,q.ClassName,q.WindowCaption);
if
(ChildhWnd
!=
0
)
{
if
(q.IsParent)
ParenthWnd
=
ChildhWnd;
result
++
;
}
else
break
;
}
//
得到了Button ? 触发它的Click事件
if
(ChildhWnd
!=
0
&&
queue.size()
==
result
+
1
)
{
SendMessage(ChildhWnd,WM_CLICK,
0
,
"
0
"
);
}
}
return
result;
}
}
查看全文
相关阅读:
BAT脚本批量调用Sql执行文件 (SqlServer 数据库)
树莓派系统刻录到首次登陆等问题
数据库视图的使用
MQ配置安装
PLSQL集合类型
PLSQL-包函数存储过程
Oracle 字段拆分替换在合并成一条
ORACLE-EXP和IMP方法介绍
javascript几个月前的时间
返回顶部实现方式
原文地址:https://www.cnblogs.com/crabo/p/591131.html
最新文章
第七章小结
如何拯救007
第五章学习小结
第四章学习小结
leetcode98 验证二叉搜索树
leetcode96 不同的二叉搜索树
迭代遍历二叉树
leetcode95 不同的二叉搜索树II
leetcode112 路径总和
leetcode77 组合
热门文章
leetcode22 括号生成
leetcode46 全排列
leetcode784 字母大小写全排列
AcWing842 排列数字
PLSQL触发器
PLSQL程序流程
PLSQL编程基础
PL/SQL基本概念
SQL Server UNION ALL 结果 SUM函数造成精度丢失
windows BAT脚本2个服务器间传递文件
Copyright © 2011-2022 走看看