有什麼方法可以從一個PB程序中獲取另外一個PB程序中指定子窗口中的各個空間屬性和數據~

kam_Roy 2014-05-15 02:15:34
我的想法是這樣的:
第一個PB程序抓第二個PB程序中的窗口控件屬性和數據窗口的數據。然後存到數據庫,第三個PB程序中就從數據庫抓數據再重新構造出來。
舉個列子:第一個程序相當於一個照相機,第二個程序就是目標,第三個程序相當於打印機。

請問有什麼辦法可以做到?

我現在通過GetWindow,GetWindowText 兩個API 函數 已經把運行中的所有窗口的標題都抓出來了,但是我只想把PB的程序的標題顯示出來,請問要怎麼過濾法?有沒有可以判斷窗口類型的API函數,還有怎麼通過窗口的句柄去取窗口裡面的信息?

求高手幫忙~

...全文
253 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
A啦Dbit 2014-06-19
  • 打赏
  • 举报
回复
汗...PB9和PB12 (ansi也加了)都未能成功, 要么就弹出保存文件的框框,要么就返回-1
引用 11 楼 lzp_lrp 的回复:
已经用delphi进行测试过,可以导出另一个pb程序中的数据
WorldMobile 2014-06-19
  • 打赏
  • 举报
回复
引用 10 楼 xiajinxian 的回复:
[quote=引用 3 楼 lzp_lrp 的回复:]   我在pb程序中的测试代码:   Function integer SndMsg(long hWnd, long uMsg, long wp, &    ref string filename) library "user32.dll" Alias For "SendMessageA"   long ll_dw_handle   ll_dw_handle = handle(dw_1)   string s   s="c:\111.txt"   SndMsg(ll_dw_handle, 1305, 2, s)   如果要编写一个数据窗口外挂程序,只要得到数据窗口的句柄就可以了,我就点到这里为止了。
版主,你的这个方法可以成功导出吗? [/quote] 已经用delphi进行测试过,可以导出另一个pb程序中的数据
WorldMobile 2014-06-19
  • 打赏
  • 举报
回复
引用 12 楼 xiajinxian 的回复:
汗...PB9和PB12 (ansi也加了)都未能成功, 要么就弹出保存文件的框框,要么就返回-1
引用 11 楼 lzp_lrp 的回复:
已经用delphi进行测试过,可以导出另一个pb程序中的数据
在pb中真没试,当时用delphi写了个例子测试了
A啦Dbit 2014-06-18
  • 打赏
  • 举报
回复
引用 3 楼 lzp_lrp 的回复:
  我在pb程序中的测试代码:   Function integer SndMsg(long hWnd, long uMsg, long wp, &    ref string filename) library "user32.dll" Alias For "SendMessageA"   long ll_dw_handle   ll_dw_handle = handle(dw_1)   string s   s="c:\111.txt"   SndMsg(ll_dw_handle, 1305, 2, s)   如果要编写一个数据窗口外挂程序,只要得到数据窗口的句柄就可以了,我就点到这里为止了。
版主,你的这个方法可以成功导出吗?
PackChen 2014-05-27
  • 打赏
  • 举报
回复
版主自以为是了,那个东西可以关掉的,那些消息可以通过关闭模式来禁止掉,所以做外挂之类的,只是针对菜鸟而已,要实现完全获得数据源和数据,必须拦截PBDWEX0.DLL 那个东西从4.0就有了,不过都是可以关掉的,不是发生消息就可以得到数据的,因为那些消息都是调用了对应的重载函数
184270428 2014-05-26
  • 打赏
  • 举报
回复
可以用PBNI来运行第二个程序。 用getfocus 得到焦点控件 getparent 找到窗口 然后 control 数组里找到你想要的对象。 当然如果你事件知道它的名字,你可以直接通过各字得到fid,这要你可以操做它了
kam_Roy 2014-05-19
  • 打赏
  • 举报
回复
引用 3 楼 lzp_lrp 的回复:
例子如下 这里当然指一个程序读取另一个程序中数据窗口的数据。设想的方法有多种,简单的方法是向数据窗口传递消息啦!先看看这个:   How to manipulate Datawindow without using datawindow functions.   // I test only on PowerBuilder 6.5 build 444   long ll_dw_handle   ll_dw_handle = handle(dw_1)   Function   Power Script   Retrieve   Post(ll_dw_handle, 1306, 0, 0)   Post(ll_dw_handle, 1320, 0, 0)   ScrollNextPage   Post(ll_dw_handle, 1318, 0, 0)   ScrollPriorPage   Post(ll_dw_handle, 1319, 0, 0)   ScrollToFirstPage   Post(ll_dw_handle, 1315, 0, 1) // 1 = first row?   ScrollToLastPage   Post(ll_dw_handle, 1315, 0, 99999999) // 99999999 = last page ? pb6 programmer don't know how to get the last page :)   Sort Dialog   Post(ll_dw_handle, 1309, 0, 0)   Filter Dialog   Post(ll_dw_handle, 1311, 0, 0)   DeleteRow   Post(ll_dw_handle, 1357, 0, 0)   Post(ll_dw_handle, 1307, 0, 0)   Append Row   Post(ll_dw_handle, 1357, 0, 0)   Post(ll_dw_handle, 1312, 0, 0)   Post(ll_dw_handle, 1315, 0, dw_1.rowcount() + 1)   Post(ll_dw_handle, 1325, 0, 0)   InsertRow   Post(ll_dw_handle, 1357, 0, 0)   Post(ll_dw_handle, 1313, 0, 0)   Post(ll_dw_handle, 1312, 0, dw_1.getrow())   Post(ll_dw_handle, 1315, 0, dw_1.getrow())   Post(ll_dw_handle, 1325, 0, 0)   Update   Post(ll_dw_handle, 1357, 0, 0)   Post(ll_dw_handle, 1338, 0, 0)   Post(ll_dw_handle, 1304, 0, 0)   SaveAs Dialog   Post(ll_dw_handle, 1338, 0, 0)   Post(ll_dw_handle, 1305, 0, 0)   Print   Post(ll_dw_handle, 1303, 0, 0)   Retrieve (yield)   Post(ll_dw_handle, 1306, 1, 0)   Post(ll_dw_handle, 1320, 0, 0)   Cancel   Post(ll_dw_handle, 1320, 0, 0)   通过测试发现使用Post(ll_dw_handle, 1305, 0, 0) ,可以使数据窗口弹出saveas的对话框,经过进一步的试验,发现wparam和lparam参数的含义分别是 :saveas type和 savefilename字符串的地址,所以我们就可以使用发送消息的方式使数据窗口内容保存为文本文件,然后读取文件就可以获取数据了。   我在pb程序中的测试代码:   Function integer SndMsg(long hWnd, long uMsg, long wp, &    ref string filename) library "user32.dll" Alias For "SendMessageA"   long ll_dw_handle   ll_dw_handle = handle(dw_1)   string s   s="c:\111.txt"   SndMsg(ll_dw_handle, 1305, 2, s)   如果要编写一个数据窗口外挂程序,只要得到数据窗口的句柄就可以了,我就点到这里为止了。
十分感謝版主的指點~謝謝
A啦Dbit 2014-05-16
  • 打赏
  • 举报
回复
引用 3 楼 lzp_lrp 的回复:
  long ll_dw_handle   ll_dw_handle = handle(dw_1)   string s   s="c:\111.txt"   SndMsg(ll_dw_handle, 1305, 2, s)   如果要编写一个数据窗口外挂程序,只要得到数据窗口的句柄就可以了,我就点到这里为止了。
收了
WorldMobile 2014-05-16
  • 打赏
  • 举报
回复
例子如下 这里当然指一个程序读取另一个程序中数据窗口的数据。设想的方法有多种,简单的方法是向数据窗口传递消息啦!先看看这个:   How to manipulate Datawindow without using datawindow functions.   // I test only on PowerBuilder 6.5 build 444   long ll_dw_handle   ll_dw_handle = handle(dw_1)   Function   Power Script   Retrieve   Post(ll_dw_handle, 1306, 0, 0)   Post(ll_dw_handle, 1320, 0, 0)   ScrollNextPage   Post(ll_dw_handle, 1318, 0, 0)   ScrollPriorPage   Post(ll_dw_handle, 1319, 0, 0)   ScrollToFirstPage   Post(ll_dw_handle, 1315, 0, 1) // 1 = first row?   ScrollToLastPage   Post(ll_dw_handle, 1315, 0, 99999999) // 99999999 = last page ? pb6 programmer don't know how to get the last page :)   Sort Dialog   Post(ll_dw_handle, 1309, 0, 0)   Filter Dialog   Post(ll_dw_handle, 1311, 0, 0)   DeleteRow   Post(ll_dw_handle, 1357, 0, 0)   Post(ll_dw_handle, 1307, 0, 0)   Append Row   Post(ll_dw_handle, 1357, 0, 0)   Post(ll_dw_handle, 1312, 0, 0)   Post(ll_dw_handle, 1315, 0, dw_1.rowcount() + 1)   Post(ll_dw_handle, 1325, 0, 0)   InsertRow   Post(ll_dw_handle, 1357, 0, 0)   Post(ll_dw_handle, 1313, 0, 0)   Post(ll_dw_handle, 1312, 0, dw_1.getrow())   Post(ll_dw_handle, 1315, 0, dw_1.getrow())   Post(ll_dw_handle, 1325, 0, 0)   Update   Post(ll_dw_handle, 1357, 0, 0)   Post(ll_dw_handle, 1338, 0, 0)   Post(ll_dw_handle, 1304, 0, 0)   SaveAs Dialog   Post(ll_dw_handle, 1338, 0, 0)   Post(ll_dw_handle, 1305, 0, 0)   Print   Post(ll_dw_handle, 1303, 0, 0)   Retrieve (yield)   Post(ll_dw_handle, 1306, 1, 0)   Post(ll_dw_handle, 1320, 0, 0)   Cancel   Post(ll_dw_handle, 1320, 0, 0)   通过测试发现使用Post(ll_dw_handle, 1305, 0, 0) ,可以使数据窗口弹出saveas的对话框,经过进一步的试验,发现wparam和lparam参数的含义分别是 :saveas type和 savefilename字符串的地址,所以我们就可以使用发送消息的方式使数据窗口内容保存为文本文件,然后读取文件就可以获取数据了。   我在pb程序中的测试代码:   Function integer SndMsg(long hWnd, long uMsg, long wp, &    ref string filename) library "user32.dll" Alias For "SendMessageA"   long ll_dw_handle   ll_dw_handle = handle(dw_1)   string s   s="c:\111.txt"   SndMsg(ll_dw_handle, 1305, 2, s)   如果要编写一个数据窗口外挂程序,只要得到数据窗口的句柄就可以了,我就点到这里为止了。
WorldMobile 2014-05-16
  • 打赏
  • 举报
回复
引用 楼主 pale42 的回复:
我的想法是這樣的: 第一個PB程序抓第二個PB程序中的窗口控件屬性和數據窗口的數據。然後存到數據庫,第三個PB程序中就從數據庫抓數據再重新構造出來。 舉個列子:第一個程序相當於一個照相機,第二個程序就是目標,第三個程序相當於打印機。 請問有什麼辦法可以做到? 我現在通過GetWindow,GetWindowText 兩個API 函數 已經把運行中的所有窗口的標題都抓出來了,但是我只想把PB的程序的標題顯示出來,請問要怎麼過濾法?有沒有可以判斷窗口類型的API函數,還有怎麼通過窗口的句柄去取窗口裡面的信息? 求高手幫忙~
用Findwindow来进行查找,根据参数里的类名,可以找到所有pb的窗口 但要把数据窗口的所有属性都取出来,可行性不大,除非你去研究数据窗口在内存中的存放,但你可以通过消息,调用数据窗口的saveas等方法
向东流 2014-05-16
  • 打赏
  • 举报
回复
那能不能外程序向数据窗口的字段输入内容呢?
gui41021 2014-05-16
  • 打赏
  • 举报
回复
强悍,PB的OCR,收藏
zhangyangziwo 2014-05-15
  • 打赏
  • 举报
回复
这是什么需求呀,太高级了吧

1,076

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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