Office中国论坛/Access中国论坛

标题: 關於direct show截圖法的一點很不爽的地方 [打印本页]

作者: JosephTan    时间: 2012-1-28 12:40
标题: 關於direct show截圖法的一點很不爽的地方
我在網上找到一個例子,是用quartz.dll, capstill.dll和 fsfwrap.dll三個鏈接庫文件實現用directshownet來截圖的.
其中好像一定要創建一個graph filter來預覽,然後截圖拍照.
令我最鬱悶和不爽的地方就是,預覽後創建出來的一個標題是"ActiveMovie Window"的窗口,也就是預覽窗口,沒法抓到其句柄,所以沒法在用完以後把它給關了.我很懶,不喜歡手動關.
在網上找了很久,有人說要用一個put_owner的方法把這個窗口賦予給一個父窗口,但是不知道在VB裏面這個怎麼實現.求助這裡的高手.
不要說getfocus, findwindow,和forewindow之類的方法了.因為全部都試過是不行的,用spy++抓到了類和標題,用findwindow也沒法抓到它的句柄,結果是0

作者: Grant    时间: 2012-1-28 12:44
有点兴趣,可以发上来看看吗
作者: JosephTan    时间: 2012-1-28 14:00
[attach]48169[/attach]
我不知道怎麼把功能分割出來,所以把數據去掉傳上來了.還有控件,少了什麼的話,可以補.
作者: 风中漫步    时间: 2012-1-28 14:03
呵呵,又是个没句柄的.0就是桌面的句柄了哈.能用SPY看到,感觉应该是有句柄的.你再试试.
作者: JosephTan    时间: 2012-1-28 14:20
句柄是有,不過每次都不一樣.用API沒法抓到.
作者: 风中漫步    时间: 2012-1-28 18:51
版本太高,看不到了.

试试循环所有窗口,根据他的标题什么的找到句柄,发送关闭消息.记不清了,好象是有这样办的.
作者: Grant    时间: 2012-1-29 00:41
少了几个控件,补一下看看

[attach]48170[/attach]
作者: JosephTan    时间: 2012-1-29 05:29
那幾個都是沒用的,我勾去掉就可以了.imageCapOnWeb那個控件是我以前用過的一個收費控件.也是截圖的.現在有免費的了,所以我也沒有用,就是裏面的image cap的窗體的.現在我用webcamcap那個了.另外那2個好像是有個什麼加密碼用的,我已經刪除了,忘記刪除reference.
作者: JosephTan    时间: 2012-1-29 05:35
對了,可能這個quartz.dll少了.這個很總要的.[attach]48172[/attach]
作者: JosephTan    时间: 2012-1-29 05:43
imagecaponweb控件,我是沒有用,不過也是可以用的.不過它產生出來的實例過10幾日就會自動失效要再從新加.而且免費版的他要在圖上加水印.我問過作者價錢,他要收600多.[attach]48173[/attach]
作者: Grant    时间: 2012-1-29 11:20
呵呵,老大的公司都放假了,没人审核帖子呢
作者: Grant    时间: 2012-1-29 12:14
版本不同吧,你的是1.0网上的是2.2 我试过网上下载好像不行哦
作者: Grant    时间: 2012-1-29 12:52
image cap 窗体中的 Me.ImageCap5.Cap 是什么控件,提示无效属性
作者: Grant    时间: 2012-1-29 12:58
呵呵,终于可以了,重新引用所有控件后好了,真怪,引用的地方也没报错
作者: Grant    时间: 2012-1-29 14:05
好像没传说中那么复杂啊,句柄也是可以取的不过好像你的代码还少了点什么,暂时还没测试
你的问题可以通过声明公用变量
Dim gGraph As FilgraphManager

再用按钮去关闭播放资源和释放资源即可
gGraph.Stop
Set gGraph = Nothing
作者: JosephTan    时间: 2012-1-29 14:28
本帖最后由 JosephTan 于 2012-1-29 14:59 编辑

好了,多謝版主.不過我還是想看看怎麼抓這個窗口的句柄.
我現在用的數據庫裏面沒有再用那個image cap on web的控件了.因為那個會在圖片上加水印.而且到一定時間就會出現你所說的那種錯誤.那個控件的作者說,要有2個註冊碼來註冊這個控件,很可能他是加了雙重保險.他要收人家600多RMB來買他這2個註冊碼,太誇張了.
如果你想測試一下我這個數據庫的讀條碼功能,可以去商店買個有條碼的商品回來然後用你電腦的攝像頭試一下.{:soso_e100:}
我想再改進一下,我的發票那個窗體不是有2個按鈕嗎?一個是識別還有一個是跳轉.當我得到barcode然後關掉那個webcam窗體以後我希望可以自動實行那個跳轉按鈕裏面的的命令,應該怎麼辦?
作者: Grant    时间: 2012-1-29 15:38
本帖最后由 Grant 于 2012-1-29 15:41 编辑

按微软的意思是ActiveMovie Window窗口句柄并没有句柄不过它提供了一个参数
不过不是你所提的put_owner,这个我没看到对象中有此属性,实际上意思是输出的窗口句柄
意思一样我们用Owner这个属性
先在顶部声明一个
Dim g_Window As IVideoWindow

在你的webcamcapture窗体中open事件
gGraph.Run前加入

Set g_Window= gGraph
g_Window.Owner = Me.hwnd

剩下的你应该明白了,看看什么效果,哈哈

视频窗体的大小,风格等属性也是可以在 IVideoWindow 类成员中得到
作者: JosephTan    时间: 2012-1-29 15:49
本帖最后由 JosephTan 于 2012-1-29 16:08 编辑
Grant 发表于 2012-1-29 15:38
按微软的意思是ActiveMovie Window窗口句柄并没有句柄不过它提供了一个参数
不过不是你所提的put_owner,这 ...


哦,你的意思是說,聲明一個IVideoWindow窗口,然後再將窗體webcamcapture的窗口句柄賦予給gGraph的這個窗體.哦,這樣的話就可以不需要用set gGraph=nothing了,直接關閉webcamcapture這個窗體就可以了是吧?

你再幫我看看#16的後面那一段的問題怎麼弄吧.

我剛才試過,果然很神奇.現在不需要把主窗口和Webcamcapture窗口縮小了.只要直接點擊窗體裏的按鈕就可以了.
作者: Grant    时间: 2012-1-29 15:50
JosephTan 发表于 2012-1-29 15:49
哦,你的意思是說,聲明一個IVideoWindow窗口,然後再將窗體webcamcapture的窗口句柄賦予給gGraph的這個窗體 ...

意思差不多,不过你最好还是释放资源后关闭窗体,比较稳妥
作者: JosephTan    时间: 2012-1-29 16:11
Grant 发表于 2012-1-29 15:50
意思差不多,不过你最好还是释放资源后关闭窗体,比较稳妥

嗯,我也加上stop和set xx=nothing好了.
那麼有沒有辦法可以關閉webcamcapture以後自動執行那個跳轉按鈕裏面的指令呢?
作者: Grant    时间: 2012-1-29 16:26
如果你想測試一下我這個數據庫的讀條碼功能,可以去商店買個有條碼的商品回來然後用你電腦的攝像頭試一下


成本高,不是好建议哈哈~我有条码枪这个东西就不用了

嗯,我也加上stop和set xx=nothing好了.
那麼有沒有辦法可以關閉webcamcapture以後自動執行那個跳轉按鈕裏面的指令呢?


其实可以通过窗体卸载事件来触发其他窗体命令

Private Sub Form_Undo(Cancel As Integer)
call Form_导航窗体.命令名称
End Sub
作者: JosephTan    时间: 2012-1-29 16:44
Grant 发表于 2012-1-29 16:26
成本高,不是好建议哈哈~我有条码枪这个东西就不用了

現在我試了幾次,發現有的時候那個activmovie window不能出現在webcamcapture的窗體裏面,有時還會出現,可是不出現在同一個位置.有辦法可以讓它固定在裏面特定位置嗎?有時不知為什麼會跳出那個設置參數的對話框來,不是已經設好有了那個設置文件,他就不跳那個對話框嗎?真奇怪.我現在試試你的說的on_form undo事件先.
作者: Grant    时间: 2012-1-29 16:51
JosephTan 发表于 2012-1-29 16:44
現在我試了幾次,發現有的時候那個activmovie window不能出現在webcamcapture的窗體裏面,有時還會出現,可是 ...

IVideoWindow 类成员中可以设定位置什么的,你可以试试
作者: JosephTan    时间: 2012-1-29 17:02
Grant 发表于 2012-1-29 16:51
IVideoWindow 类成员中可以设定位置什么的,你可以试试

這個好哇,很多人都沒有買激光掃描bar code器的,但是很多人都有攝像頭的.我也有個掃描器,但是我那個是鼠標頭的,要用上還要話幾十塊買一個轉usb頭才行,而且要買支持掃描器那種轉接頭.我淘寶買了不支持的轉接頭,讓我鬱悶無比啊.
哦,那我試試.
我剛才試了一下on_unload事件來引發call 發票.command110_click但是不行.因為我那個按鈕的命令是用了sendkey方法的.可能這樣觸發它就不能正常了.再幫忙看看吧.
作者: Grant    时间: 2012-1-29 17:07
    g_window.Left = 0
    g_window.Top = 0

你试试,我测试是可以的
作者: Grant    时间: 2012-1-29 17:16
JosephTan 发表于 2012-1-29 17:02
這個好哇,很多人都沒有買激光掃描bar code器的,但是很多人都有攝像頭的.我也有個掃描器,但是我那個是鼠標 ...

你在call 发票窗体前要先把窗体打开并置于其他窗体前面就可以了
作者: Grant    时间: 2012-1-29 17:18
本帖最后由 Grant 于 2012-1-29 17:24 编辑
call 發票.command110_click但是不行.因為我那個按鈕的命令是用了sendkey方法的


奇怪,怎么回复也需要审核帖子了,刚才都还不要的

在你call前先把 "fapiao"窗体open并置于所有窗体之上

发现问题原来 發票 作怪
作者: Grant    时间: 2012-1-29 17:19
call 發票.command110_click但是不行.因為我那個按鈕的命令是用了sendkey方法的.


你应该先open窗体然后把发票窗体置于第一就行了,再去调用call
作者: Grant    时间: 2012-1-29 17:35
JosephTan  我還想問一下,你是怎麼找到這些東西的方法和屬性什麼的?我沒有那個directshow的sdk,什麼都不知道


F2看对象类型
作者: JosephTan    时间: 2012-1-29 17:46
Grant 发表于 2012-1-29 17:18
奇怪,怎么回复也需要审核帖子了,刚才都还不要的

在你call前先把 "fapiao"窗体open并置于所有窗体之上 ...

可以把導航窗體至於所有窗體之上嗎?因為發票是這個時候導航窗體的一個子窗體.另外把某個窗體至於所有窗體之上是什麼命令?
作者: Grant    时间: 2012-1-29 17:50
本帖最后由 Grant 于 2012-1-29 17:50 编辑
JosephTan 发表于 2012-1-29 17:46
可以把導航窗體至於所有窗體之上嗎?因為發票是這個時候導航窗體的一個子窗體.另外把某個窗體至於所有窗體 ...


只要其他打开的窗体中没有模式窗体就可以用获得焦点的方式给 "發票"窗体焦点
还可以打开發票窗体的时候设置为模式弹出窗体
作者: JosephTan    时间: 2012-1-29 17:56
Grant 发表于 2012-1-29 17:50
只要其他打开的窗体中没有模式窗体就可以用获得焦点的方式给 "發票"窗体焦点
还可以打开發票窗体的时候 ...

不太明白.模式窗体是什么意思?我每次打开数据库就是打开发票这个窗体的,但是它只是导航窗体下的一个子窗体,要把发票这个的模式属性设定为"是"吗?
然后再在webcamcapture窗体的unload事件的那个发票.command110_click语句之前加上一句
发票.setfocus这样的语句吗?
作者: Grant    时间: 2012-1-29 18:23
Grant 发表于 2012-1-29 17:50
只要其他打开的窗体中没有模式窗体就可以用获得焦点的方式给 "發票"窗体焦点
还可以打开發票窗体的时候 ...

如果想不打开就实现方法一把代码写到现在的窗体,方法二写成模块便于调用
作者: JosephTan    时间: 2012-1-29 18:27
本帖最后由 JosephTan 于 2012-1-29 19:38 编辑

還是沒法自動執行那個按鈕的命令

刚才没看见你最后一个回复.现在试一下改成模块
作者: JosephTan    时间: 2012-1-29 19:53
Grant 发表于 2012-1-29 18:23
如果想不打开就实现方法一把代码写到现在的窗体,方法二写成模块便于调用

我写了个模块但是还是没有达到按那个按钮的效果:
我的模块是这样:
Sub Jump()
If strBarcodes = "" Then
Exit Sub
Else
Form_发票.Combo51 = strBarcodes
strBarcodes = ""
Form_发票.Combo51.SetFocus
SendKeys "^x", True
DoEvents
SendKeys "^v", True
SendKeys "{ENTER}", True
End If
End Sub
然后我在那在webcamcapture窗体的unload事件加上
On Error Resume Next
gGraph.Stop
Set gGraph = Nothing
Jump
第2,3行是因为如果没拍摄到东西的情况下手动把webcamcapture关闭的话,它不会把gGraph关掉,那么下次点拍摄的时候它就是空的.
但是没有达到我预期的效果,代码执行到sendkey之前,就是setfocus那里.不明白为什么sendkey执行不了,已经是调用模块的方法了.
作者: JosephTan    时间: 2012-1-29 21:28
我想了一个补救方法,不过不是很好.就是那个camcap()函数里面加判断语句,判断是否已经拿到bar code,拿到的话就执行jump拿不到就执行扫描的部分,这样我就可以连续按2下快捷键来跳转.不过也是有点缺陷.
作者: Grant    时间: 2012-1-29 22:28
其实应该是挺好解决的,不过我不太清楚你的获取,不然可以帮你想下 {:soso_e113:}
作者: JosephTan    时间: 2012-1-29 22:59
本帖最后由 JosephTan 于 2012-1-29 23:34 编辑
Grant 发表于 2012-1-29 22:28
其实应该是挺好解决的,不过我不太清楚你的获取,不然可以帮你想下


不知為什麼原來不行,現在運行的很好.[attach]48174[/attach]

我想應該解釋一下:
我的數據庫可以生成條碼,打印條碼(EAN-13),你可隨便輸入一個12位數到然後得到一個13位的條碼,然後把這個條碼給一張發票,然後每一張發票都有一個條碼打印在上面.你可以用攝像頭或者掃描錄入條碼,掃描銷帳那裡就是批量的把條碼從掃描器錄入,然後用含有參數的查詢把相應的發票記錄的已收款值進行設定.另外一個就是當你拿著一張發票的時候,你不需要看它的單號是多少,只要拿著發票對這電腦的攝像頭按一下F3打開預覽,再按一次就掃描到條碼,並且跳轉到那張單的記錄的位置.
以上就是那個掃描控件的應用.對了,我要把掃描的鏈接庫共享出來先.[attach]48175[/attach]
作者: Grant    时间: 2012-1-29 23:32
我已經搞定了.還是弄成模塊好調用.多謝了.這個帖子應該加精啊,你回覆得太精彩了

今天还算有时间上来闲逛 {:soso_e120:}
作者: JosephTan    时间: 2012-1-29 23:38
Grant 发表于 2012-1-29 23:32
今天还算有时间上来闲逛

我是沒有浪費時間啦.
作者: Grant    时间: 2012-1-29 23:40
本帖最后由 Grant 于 2012-1-29 23:41 编辑
JosephTan  上傳了bar code識別的com控件

收到,感谢你的例子,如果你再把视频窗体边框去掉会更好,慢慢优化吧,哈哈
作者: Grant    时间: 2012-1-29 23:49
JosephTan  IVideoWindow有這個方法嗎?

很肯定的告诉你有
g_Window.WindowStyle
g_Window.WindowStyleEx
作者: Grant    时间: 2012-1-30 00:41
你尝试调换下位置,先把窗体风格更改了再移动位置
作者: JosephTan    时间: 2012-1-30 01:20
[attach]48185[/attach]
作者: Grant    时间: 2012-1-30 10:41
看着不错,楼主有机会就重新整理一下跟网友分享一下就更好了
作者: t小宝    时间: 2012-1-30 15:37
你们讨论的是在ACCESS中扫描获取照片?
作者: JosephTan    时间: 2012-1-30 16:43
t小宝 发表于 2012-1-30 15:37
你们讨论的是在ACCESS中扫描获取照片?

是用攝像頭拍照片.不是掃描.
作者: 轻风    时间: 2012-1-31 08:24
期待楼主把优化后的示例共享
作者: JosephTan    时间: 2012-1-31 13:23
轻风 发表于 2012-1-31 08:24
期待楼主把优化后的示例共享

最近我在忙提貨櫃的事情,有時間我會整理一下的.
作者: JosephTan    时间: 2012-2-5 16:25
Grant 发表于 2012-1-30 10:41
看着不错,楼主有机会就重新整理一下跟网友分享一下就更好了

我写了篇日志:
http://www.office-cn.net/home.ph ... ward=1&id=14913
作者: Grant    时间: 2012-2-5 16:39
谢谢分享
作者: JosephTan    时间: 2012-2-10 11:12
Grant 发表于 2012-2-5 16:39
谢谢分享

能否帮忙看看我上传的这个数据库的子窗体发票里面的选定默认打印机的combo box,为什么选了以后一定得重启access才能改到?有办法不需要重启吗?




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3