Vfp 按钮确定!

yrt888 2009-06-16 10:15:03
如果 按钮的类为 "Button" ,BM_CLICK = 0xF5 SendMessage(SendHwnd,BM_CLICK,0,0)&&自动按下按钮

就可以自动确定,不过有个按钮的类为 “AfxWnd42”,通过上述方法就不行了,不知是不是参数“BM_CLICK = 0xF5 ”不对,还是由于类不是"Button"而不行,现在暂时的方法是:

llHandle=FindWindow(Null,'用户登录V6版')
If llHandle>0
hWndID=GetDlgItem(llHandle,1) * 该窗口没有标题,并且同类有几个,只能用ID
IF hWndID>0
=SetForegroundWindow(hWndID)
DECLARE Long keybd_event IN WIN32API Long, Long, Long, Long
=INKEY(0.5)
keybd_event( 0x0D, 0, 0, 0 ) *模拟按下回车键
ENDIF
ENDIF

虽然是解决问题,不过希望能通过直接发送信息就确定,各位大侠看看有没有办法,谢谢!
...全文
95 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
yrt888 2009-06-17
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 dkfdtf 的回复:]
刚才回看了一下,其实你说一楼的代码就可以实现,也就不需要后面的代码了
可能 AfxWnd42 这个窗口类原来就没有处理 BM_CLICK 消息
[/Quote]

是的,一楼的代码是可以的,只是我想看看有没有其他的方法,谢谢!
都市夜猫 2009-06-17
  • 打赏
  • 举报
回复
刚才回看了一下,其实你说一楼的代码就可以实现,也就不需要后面的代码了
可能 AfxWnd42 这个窗口类原来就没有处理 BM_CLICK 消息
yrt888 2009-06-17
  • 打赏
  • 举报
回复
成功了,确实精简很多,学识了新知识,谢谢!
都市夜猫 2009-06-17
  • 打赏
  • 举报
回复
SendMessage(SendHwnd,BM_CLICK,0,0) 这种方法我还没用过

不过能达到目的就行,上面的代码可以简化一下:
Declare Long FindWindow In WIN32API String, String
Declare Long GetWindowThreadProcessId In WIN32API Long, Long @
Declare Long GetDlgItem In WIN32API Long, Long
Declare Long AttachThreadInput In WIN32API Long, Long, Long
Declare Long SetFocus In WIN32API Long
Declare Long keybd_event In WIN32API Long, Long, Long, Long

m.lnHwnd = FindWindow( Null, '广发证券至强版V6.01' )
If m.lnHwnd > 0
m.iPId = 0
m.iTId = GetWindowThreadProcessId( m.lnHwnd, @ m.iPid )
m.hBtnID = GetDlgItem(m.lnHwnd, 1)
AttachThreadInput( _vfp.ThreadID, m.iTId, 1 )
SetFocus(m.hBtnID)
keybd_event( 0x0D, 0, 0, 0 )
AttachThreadInput( _vfp.ThreadID, m.iTId, 0 )
Endif
yrt888 2009-06-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 apple_8180 的回复:]
你14楼的方法也不是发消息方法
[/Quote]

是啊!
十豆三 2009-06-17
  • 打赏
  • 举报
回复
你14楼的方法也不是发消息方法
yrt888 2009-06-17
  • 打赏
  • 举报
回复
代码:

llHandle=FindWindow(Null,'广发证券至强版V6.01')
If llHandle>0
LOCAL oWbemLocator,oWMIService, oItems, oItem
oWbemLocator = CREATEOBJECT("WbemScripting.SWbemLocator")
oWMIService = oWbemLocator.ConnectServer(".", "root/cimv2")
oItems = oWMIService.ExecQuery("SELECT * FROM Win32_Process")
FOR EACH oItem IN oItems
MAJC=oItem.Name
MAJC=LOWER(MAJC)
IF MAJC='tdxw.exe'
m.iPId0=oItem.ProcessId
EXIT
ENDIF
ENDFOR


m.hWnd = 0
m.iPId = 0
m.iTId = 0
DECLARE Long GetWindowThreadProcessId IN WIN32API Long, Long @
DO WHILE .T.
m.hWnd = FindWindowEx( 0, m.hWnd, NULL, NULL )
IF ( 0 == m.hWnd )
EXIT
ELSE
m.iTId = GetWindowThreadProcessId( m.hWnd, @ m.iPid )
IF ( m.iPId == m.iPId0 )
EXIT
ENDIF
ENDIF
ENDDO

IF ( 0 != m.hWnd ) AND ( m.iPId == m.iPId0 )
DECLARE Long AttachThreadInput IN WIN32API Long, Long, Long
DECLARE Long SetActiveWindow IN WIN32API Long hWnd
DECLARE Long keybd_event IN WIN32API Long, Long, Long, Long
DECLARE Long SetFocus IN WIN32API Long
AttachThreadInput( _vfp.ThreadId, m.iTId, 1 )
SetActiveWindow( m.hWnd )
hWndID=GetDlgItem(llHandle,1)
IF hWndID>0
SetFocus(hWndID)
keybd_event( 0x0D, 0, 0, 0 )
AttachThreadInput( _vfp.ThreadId, m.iTId, 0 )
ENDIF
ENDIF

endif


十豆三 2009-06-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yrt888 的回复:]
参考了一下旧帖,代码如下:

llHandle=FindWindow(Null,'广发证券至强版V6.01')
If llHandle>0
m.hWnd = 0
m.iPId = 0
m.iTId = 0
DECLARE Long GetWindowThreadProcessId IN WIN32API Long, Long @
DO WHILE .T.
m.hWnd = FindWindowEx( 0, m.hWnd, NULL, NULL )
IF ( 0 == m.hWnd )
EXIT
ELSE
m.iTId = GetWindowThreadProcessId( m.hWnd, @ m.iPid )
IF ( m…
[/Quote]

将代码帖全(m.iPId0等没有声明,所以没有帖全),好让 dkfdtf 看看有没有优化的方法
qd163 2009-06-17
  • 打赏
  • 举报
回复
yrt888 2009-06-16
  • 打赏
  • 举报
回复
睡了,明天继续学习,谢谢!

yrt888 2009-06-16
  • 打赏
  • 举报
回复
参考了一下旧帖,代码如下:

llHandle=FindWindow(Null,'广发证券至强版V6.01')
If llHandle>0
m.hWnd = 0
m.iPId = 0
m.iTId = 0
DECLARE Long GetWindowThreadProcessId IN WIN32API Long, Long @
DO WHILE .T.
m.hWnd = FindWindowEx( 0, m.hWnd, NULL, NULL )
IF ( 0 == m.hWnd )
EXIT
ELSE
m.iTId = GetWindowThreadProcessId( m.hWnd, @ m.iPid )
IF ( m.iPId == m.iPId0 )
EXIT
ENDIF
ENDIF
ENDDO

IF ( 0 != m.hWnd ) AND ( m.iPId == m.iPId0 )
DECLARE Long AttachThreadInput IN WIN32API Long, Long, Long
DECLARE Long SetActiveWindow IN WIN32API Long hWnd
DECLARE Long keybd_event IN WIN32API Long, Long, Long, Long
DECLARE Long SetFocus IN WIN32API Long
AttachThreadInput( _vfp.ThreadId, m.iTId, 1 )
SetActiveWindow( m.hWnd )
hWndID=GetDlgItem(llHandle,1)
IF hWndID>0
SetFocus(hWndID)
keybd_event( 0x0D, 0, 0, 0 )
AttachThreadInput( _vfp.ThreadId, m.iTId, 0 )
ENDIF
ENDIF

endif

是成功确认的,感觉代码长了点,不知有没有搞错!

ACMAIN_CHM 2009-06-16
  • 打赏
  • 举报
回复
咱们也试一下
yrt888 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dkfdtf 的回复:]
嚯嚯,竟敢不经允许擅自使用我的表情图标,收钱!!!
[/Quote]

表情很可爱呵!

yrt888 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dkfdtf 的回复:]
引用 3 楼 yrt888 的回复:
我的系统是 XP SP2 ,VFP9 !谢谢!


喔,我没说清楚,我的意思是这个“用户登录V6版”是哪个程序显示的?
[/Quote]

广发证券网上交易系统!
都市夜猫 2009-06-16
  • 打赏
  • 举报
回复
嚯嚯,竟敢不经允许擅自使用我的表情图标,收钱!!!
yrt888 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dkfdtf 的回复:]
不知道具体的运行环境是什么,没有运行环境就不好试验了
解决思路大概跟下列函数有关
SetActiveWindow, GetWindowThreadProcessId, AttachThreadInput, SetFocus
[/Quote]

这个好像以前我提问关于马桶浏览器的关闭的帖子的回复近似,先翻查旧帖看看,谢谢!

都市夜猫 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yrt888 的回复:]
我的系统是 XP SP2 ,VFP9 !谢谢!
[/Quote]
喔,我没说清楚,我的意思是这个“用户登录V6版”是哪个程序显示的?
yrt888 2009-06-16
  • 打赏
  • 举报
回复
我的系统是 XP SP2 ,VFP9 !谢谢!
都市夜猫 2009-06-16
  • 打赏
  • 举报
回复
不知道具体的运行环境是什么,没有运行环境就不好试验了
解决思路大概跟下列函数有关
SetActiveWindow, GetWindowThreadProcessId, AttachThreadInput, SetFocus
yrt888 2009-06-16
  • 打赏
  • 举报
回复
夜了,可能要睡了!先谢谢各位!

2,748

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧