Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2342281
  • 博文数量: 321
  • 博客积分: 3440
  • 博客等级: 中校
  • 技术积分: 2992
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-24 09:08
个人简介

我就在这里

文章分类

全部博文(321)

文章存档

2015年(9)

2014年(84)

2013年(101)

2012年(25)

2011年(29)

2010年(21)

2009年(6)

2008年(23)

2007年(23)

分类: WINDOWS

2014-06-09 23:26:05

我们经常会碰到与第三方程序打交道的情况,例如,在pb里打印,某些打印机的驱动软件会自动弹出交互窗口,用户可以选择预览、打印,少量打印的时候问题,有该弹出窗口会很友好,但是面对大批量的打印作业时,重复点击打印按钮也是很烦人的一件事情(偶最讨厌的就是一成不变的重复操作^_^);
 
简单的做法是找个按键精灵设定好坐标,由他来重复执行点击操作,省事,但是比较占用资源,受制于第三方,而且一旦坐标有变化,就解决不了。
 
其实利用api很容易做到像第三方程序发送消息,牵涉到以下api。
findwindow -- 查找窗口句柄
findWindowex -- 查找窗口中指定控件句柄
sendmessage -- 向指定窗口句柄发送消息
 
申明如下:
Function long FindWindowA (String lpClassName , String lpWindowName ) Library "user32.dll"

Function Long FindWindowExA(Long ph, Long ch, ref String cn, ref String wn) Library "user32.dll"
function long SendMessage (long hwnd ,long wMsg , long wParam,long lParam) Library "user32.dll" Alias for "SendMessageA"
 
 
代码如下:
//====================================================================
// 事件: wf_printtax()
//--------------------------------------------------------------------
// 描述: 调用API向 弹出的窗口中的 打印 按钮发送点击动作
//--------------------------------------------------------------------
// 参数:
//--------------------------------------------------------------------
// 返回:  integer 1 成功 -1 失败
//--------------------------------------------------------------------
// 作者: Joshua Zou  日期: 2008年06月16日
//--------------------------------------------------------------------
// Copyright (c) 2002-2007 , All rights reserved.
//--------------------------------------------------------------------
// 修改历史:
//
//====================================================================

ULong ll_handle,ll_handle_child,ll_null
String ls_null,ls_text
Constant long BM_CLICK = 245
SetNull(ls_null)
setnull(ll_null)
//获得该消息窗口的句柄  
ll_handle = FindWindowA(ls_null,'打印提示') //字符串"打印提示"为消息窗口的标题名称  
IF ll_handle>0 THEN
 ls_text = "打 印" //字符串"打印"为窗口的控件按钮的caption
 setnull(ls_null)
 ll_handle_child=FindWindowExA(ll_handle, ll_null, ls_null,ls_text )
 if ll_handle_child>0 then
  SendMessage(ll_handle_child, BM_CLICK, 0, 0)
  return  1
 end if
END IF
return -1
 
 
ps:
这里不得不提到一个非常重要的软件,就是vc里自带的spy++,他是最好的跟踪进程,查看进程控件句柄的工具。
有了它可以很容易获取到窗口中各控件之间的关系,在窗口window中有个groupbox,按钮commandbutton在groupbox里。找句柄的时候,其顺序是 window->groupbox->commandbutton ,而不是window->commandbutton,如果直接在窗口中找button的句柄肯定是找不到的,我刚开始做测试的时候就犯了这个错误。
 
spy++很容易上手,这里给个spy++7.1的下载地址
 
 
 
阅读(3016) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~