注册 登录
编程论坛 VFP论坛

如何编一个程序打开Windows的记事本并录入“VFP编程论坛”这几个字

kesc 发布于 2020-07-22 09:00, 4369 次点击
如何编一个程序打开Windows的记事本并录入“VFP编程论坛”这几个字
28 回复
#2
zhken2020-07-22 11:03
一种方法是 RUN /N3 Notepad ,打开一个记事本, 再摸拟按键输入 可以用文本保存到剪贴板 一键粘贴
二种方法是 用api 函数
#3
sdta2020-07-22 11:23
创建文件
STRTOFILE("","AA.TXT")
打开文件
MODIFY FILE AA.TXT
#4
zhken2020-07-22 11:27
declare keybd_event in win32api short bvk,short bscan,integer dwflags,integer deextrainfo
_cliptext='VFP编程论坛'
RUN /N3 Notepad
WAIT '' TIMEOUT 1
keybd_event(17,0,0,0)
keybd_event(asc('V'),0,0,0)
keybd_event(asc('V'),0,2,0)
keybd_event(17,0,2,0)
#5
kesc2020-07-22 19:00
回复 4楼 zhken
如果记事本原本就打开了,还要加什么语句吗,谢谢

[此贴子已经被作者于2020-7-22 19:02编辑过]

#6
zhken2020-07-22 22:47
第一种是要用api找到这个窗口,并设置焦点
第二是用低级函数来判断文本是否有打开,自己研究一下,这个过程可以学习很多东西
#7
kesc2020-07-22 23:31
回复 6楼 zhken
不行啊,我自己添加的第一句就出错
DECLARE integer Findwindow IN WIN32API string,string
mhandle=findwindow(0,'记事本')
=showwindow(mhandle,1)
declare keybd_event in win32api short bvk,short bscan,integer dwflags,integer deextrainfo
_cliptext='VFP编程论坛'
keybd_event(17,0,0,0)
keybd_event(asc('V'),0,0,0)
keybd_event(asc('V'),0,2,0)
keybd_event(17,0,2,0)
#8
吹水佬2020-07-23 08:54
不只是针对记事本的吧
#9
kesc2020-07-23 09:13
我是菜鸟真的不懂啊,没人帮帮我吗,到底错在哪里,网上的资料很少啊,找了一晚上,没找到
#10
吹水佬2020-07-23 09:16
回复 9楼 kesc
具体是想做什么,为何一定要用记事本,用VFP的文本文件编辑功能不可以吗?
#11
kesc2020-07-23 09:21
回复 10楼 吹水佬
我们新上的财务软件从出纳系统生成凭证不能生成模式凭证,因为联用了出纳系统,一定要从出纳系统生成凭证才行,如果手工凭证是支持模式凭证的,软件商也说从出纳系统生成凭证不支持模式的,真的无语,只好自己写个录入模式凭证的小工具,现在就是不懂怎么找窗口和设置焦点

[此贴子已经被作者于2020-7-23 09:30编辑过]

#12
sdta2020-07-23 09:30
以下是引用kesc在2020-7-23 09:21:45的发言:

我们新上的财务软件从出纳系统生成凭证不能生成模式凭证,软件商也说暂时不支持,只好自己写个录入模式凭证的小工具,现在就是不懂怎么找窗口和设置焦点

提问题要直奔主题,不要遮遮掩掩,回帖已到10楼了,才说出要解决的问题,浪费了大家和你多少时间?大家都是成年人了.............
#13
kesc2020-07-23 09:34
回复 12楼 sdta
谢谢大佬的谆谆教导,那该怎么解决

[此贴子已经被作者于2020-7-23 09:36编辑过]

#14
sdta2020-07-23 09:38
VFP版块只解决与VFP有关的技术问题,你提出了与VFP有关的技术问题吗?
#15
kesc2020-07-23 09:59
回复 14楼 sdta
用vfp程序模拟键盘录入
#16
吹水佬2020-07-23 11:04
回复 11楼 kesc
看来解决记事本的问题并不一定能解决实际的问题,具体问题要具体分析
模拟手工输入,通常是定位输入焦点后模拟鼠标键盘操作。同时有多个输入焦点就有点麻烦,效率也不高
商业软件,给钱就好办,开发导入导出数据接口功能
#17
zhken2020-07-23 11:05
先找到这个窗口,设置焦点,再用绝对的位置模拟粘贴,由于要输入的位置多,加上偶尔跳出的弹窗,很容易失败.
#18
kesc2020-07-23 11:34
回复 17楼 zhken
找窗口和设置焦点的语句怎么写,能给一个范例吗
#19
kesc2020-07-23 11:39
回复 16楼 吹水佬
这个软件只有手工凭证的导入导出功能,没有从出纳系统生成凭证的导入功能,因为如果导入就不能关联出纳收付款单,实施顾问也无能为力
#20
吹水佬2020-07-23 11:50
回复 19楼 kesc
既然软件有手工凭证的导入导出功能
可否这样:
从出纳系统生成凭证数据导出,将出纳系统导出的凭证数据转换成软件导入的数据后再导入
#21
kesc2020-07-23 13:59
试过了,不行,导入后变成另一张没有关联收付款单的凭证
#22
kesc2020-07-23 14:00
回复 20楼 吹水佬
试过了,不行,导入后变成另一张没有关联收付款单的凭证,能行的话也不会来麻烦大家
#23
xuminxz2020-07-23 14:57
什么叫模式凭证,什么叫手工凭证?一个凭证是不是可以理解为一条记录?模式凭证是如何产生的?导入的模板有没有凭证号之类的。
这里很多人对你的财务软件可能一窍不通。最好不要说与计算机无关的专业术语。最好把你两种工作模式的流程说一下。
办法总是有的,很多年前遇到过类似的情况,导入其它系统的数据只能一条条地导,后来用它备份与恢复功能,把数据导进去了。


[此贴子已经被作者于2020-7-23 15:06编辑过]

#24
zhken2020-07-23 15:21
将出纳系统导出的凭证数据看一下是什么格式的文档,看能否化解,有些是XML格式的话可以用VFP来写.
#25
xuminxz2020-07-23 15:37
引入凭证试试?
#26
吹水佬2020-07-23 15:46
以下是引用kesc在2020-7-22 23:31:12的发言:

不行啊,我自己添加的第一句就出错
DECLARE integer Findwindow IN WIN32API string,string
mhandle=findwindow(0,'记事本')
=showwindow(mhandle,1)
declare keybd_event in win32api short bvk,short bscan,integer dwflags,integer deextrainfo
_cliptext='VFP编程论坛'
keybd_event(17,0,0,0)
keybd_event(asc('V'),0,0,0)
keybd_event(asc('V'),0,2,0)
keybd_event(17,0,2,0)


API函数声明要区分大小写
DECLARE integer FindWindow IN WIN32API string,string
showwindow未声明(ShowWindow)

试试:
DECLARE LONG FindWindow IN user32 STRING@,STRING@
DECLARE LONG SetWindowPos IN user32 LONG,LONG,LONG,LONG,LONG,LONG,LONG
DECLARE LONG SetFocus IN user32 LONG
DECLARE LONG keybd_event IN user32 LONG,LONG,LONG,LONG
cWindowName = "无标题 - 记事本"  && 按实际的窗口标题
hWnd = FindWindow(NULL, cWindowName)
IF hWnd == 0
    ? "找不到窗口"
    RETURN
ENDIF
SetWindowPos(hWnd, -1, 0, 0, 0, 0, 3)  && HWND_TOPMOST
SetFocus(hWnd)
_cliptext='VFP编程论坛'
keybd_event(17,0,0,0)
keybd_event(asc('V'),0,0,0)
keybd_event(asc('V'),0,2,0)
keybd_event(17,0,2,0)
SetWindowPos(hWnd, -2, 0, 0, 0, 0, 3)  && HWND_NOTOPMOST

如果针对某个输入对象,还要模拟鼠标动作使对象获得输入焦点
模拟鼠标动作API mouse_event()

API SendInput() 可以模拟一组鼠标键盘动作,功能强大,但用起来有点复杂。


[此贴子已经被作者于2020-7-23 16:08编辑过]

#27
吹水佬2020-07-23 15:52
以下是引用kesc在2020-7-23 13:59:06的发言:

试过了,不行,导入后变成另一张没有关联收付款单的凭证

20楼说过,要先转换数据。如果软件的导入功能正常,就看看导入的数据格式,按此格式要求来转换。
#28
xuminxz2020-07-23 15:57
一般财务软件都有备份与恢复功能吧?能不能通过这一功能间接导入?
#29
zhken2020-07-24 12:44
Declare keybd_event In Win32API Short bVk,Short bScan,Integer dwFlags, Integer deExtraInfo
Declare mouse_event In Win32API Integer dwFlags,Integer dx,Integer dy,Integer cButtons,Integer dwExtraInfo
MOUSEEVENTF_LEFTDOWN=0x2
MOUSEEVENTF_LEFTUP=0x4
MOUSEEVENTF_MIDDLEDOWN=0x20
MOUSEEVENTF_MIDDLEUP=0x40
MOUSEEVENTF_MOVE=0x1
MOUSEEVENTF_ABSOLUTE=0x8000
MOUSEEVENTF_RIGHTDOWN=0x8
MOUSEEVENTF_RIGHTUP=0x10
=mouse_event(MOUSEEVENTF_ABSOLUTE+MOUSEEVENTF_MOVE,20000,20000,0,0) &&移动鼠标到绝对位置10000,10000
=mouse_event(MOUSEEVENTF_LEFTDOWN+MOUSEEVENTF_LEFTUP,0,0,0,0)
WAIT '' TIMEOUT 0.5
_cliptext='VFP编程论坛'
keybd_event(17, 0, 0, 0)
keybd_event(Asc('V'), 0, 0, 0)
keybd_event(Asc('V'), 0, 2, 0)
keybd_event(17, 0, 2, 0)

&&将就用一下。移动鼠标到绝对位置坐标10000,10000后粘贴
1