如何截取被看不见的视窗内容? |
答題得分者是:wameng
|
dg822
一般會員 發表:14 回覆:38 積分:10 註冊:2004-12-16 發送簡訊給我 |
很简单,如下代码:
[code delphi] procedure TForm1.Timer1Timer(Sender: TObject); var HWND:THandle; dc:HDC ; rect:TRect ; begin Hide ; HWND:=handle; GetWindowRect(HWND,rect); dc:=GetWindowDC(HWND); try BitBlt(Image1.Canvas.Handle,0,0,rect.Right-rect.Left,rect.Bottomrect.Top,dc,0,0,SRCCOPY ); Image1.Invalidate ; finally ReleaseDC(HWND,dc); Timer1.Enabled :=false; end; end; [/code] 结果,在Image1上显示的是原来Form1后面的图画。 如题,如果我想取看不见的视窗内容,应该怎么做? |
deity
尊榮會員 發表:90 回覆:876 積分:678 註冊:2003-05-09 發送簡訊給我 |
|
jamests
初階會員 發表:0 回覆:43 積分:28 註冊:2005-01-21 發送簡訊給我 |
|
dg822
一般會員 發表:14 回覆:38 積分:10 註冊:2004-12-16 發送簡訊給我 |
|
jamests
初階會員 發表:0 回覆:43 積分:28 註冊:2005-01-21 發送簡訊給我 |
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
dg822
一般會員 發表:14 回覆:38 積分:10 註冊:2004-12-16 發送簡訊給我 |
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
dg822
一般會員 發表:14 回覆:38 積分:10 註冊:2004-12-16 發送簡訊給我 |
|
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
SphereXP執行畫面 http://www.spheresite.com/screenshots.html
雖然畫面很好看但實際試用的時候就出問題了 將視窗拉到螢幕外面,這軟體就抓不到完整的畫面 http://img246.imageshack.us/img246/6739/68861905nr1.gif 發現了一個神奇的軟體TopDesk 官方網站http://www.otakusoftware.com/topdesk/ 在試用的時候將視窗拉出螢幕外,軟體也能正確完整的視窗畫面抓出來 不僅如此連被其他程式所壓到的視窗也能抓出來 我用bcb的tdump去剖析topdesk.dll發現SetWindowsHook 或許又是API HOOK了 類似問題 http://delphi.ktop.com.tw/board.php?cid=30&fid=69&tid=79161 |
Kingron
中階會員 發表:1 回覆:51 積分:60 註冊:2005-09-14 發送簡訊給我 |
这个问题的确不是普通的方式可以做到。
由于没有使用这个软件,也无法具体分析。 估计可以用这种方法:Hook目标窗口,给目标窗口发送WM_PAINT消息,处理绘画并存储。 另外用下面的代码可以抓被遮住窗口的内容,例如被Notepad窗口遮住的窗口的内容: [code delphi] const WS_EX_LAYERED = $00080000; var DC: HDC; FStyle: Longint; FCanvas: TCanvas; bmpScreen : TBitmap; FHwnd: HWND; R : TRect; begin FHwnd := FindWindow('Notepad', nil); GetWindowRect(FHwnd, R); FStyle := GetWindowLong(FHwnd, GWL_EXSTYLE); FStyle := FStyle or WS_EX_LAYERED; SetWindowLong(FHwnd, GWL_EXSTYLE, FStyle); Sleep(500); bmpScreen := TBitmap.Create; bmpScreen.Width := R.Right - R.Left; bmpScreen.Height := R.Bottom - R.Top; bmpScreen.Canvas.Lock; DC := GetDC(0); with bmpScreen do Bitblt(Canvas.Handle, 0, 0, bmpScreen.Width, bmpScreen.Height, DC, R.Left, R.Top, SRCCOPY); ReleaseDC(0, DC); bmpScreen.Canvas.UnLock; Image1.Picture.Assign(bmpScreen); FStyle := GetWindowLong(FHwnd, GWL_EXSTYLE); FStyle := FStyle and (not WS_EX_LAYERED); SetWindowLong(FHwnd, GWL_EXSTYLE, FStyle); end; [/code] 关注。 ===================引 用 文 章=================== SphereXP執行畫面 http://www.spheresite.com/screenshots.html 雖然畫面很好看但實際試用的時候就出問題了 將視窗拉到螢幕外面,這軟體就抓不到完整的畫面 http://img246.imageshack.us/img246/6739/68861905nr1.gif 發現了一個神奇的軟體TopDesk 官方網站http://www.otakusoftware.com/topdesk/ 在試用的時候將視窗拉出螢幕外,軟體也能正確完整的視窗畫面抓出來 不僅如此連被其他程式所壓到的視窗也能抓出來 我用bcb的tdump去剖析topdesk.dll發現SetWindowsHook 或許又是API HOOK了 類似問題 http://delphi.ktop.com.tw/board.php?cid=30&fid=69&tid=79161
------
超级猛料:http://kingron.delphibbs.com |
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
後來我注意到一個軟體也有類似功能TaskSwitchXP
PChome介紹http://toget.pchome.com.tw/intro/utility_system/utility_system_Optimize/22902.html 官網執行畫面http://www.ntwind.com/software/taskswitchxp/screenshots.html 最重要的是有原始碼可以下載,經過一個月的研究終於發現windows XP以上的版本就有提供這個功能的API 原來TopDesk和TaskSwitchXP只能限定在XP以上的作業系統才能執行原因就是如此 範例執行檔下載http://delphi.ktop.com.tw/download.php?download=upload/462b2d3ecd83c_Project1.exe 執行後會自行開啟記事本而視窗位置在螢幕外,但按下抓圖按鈕後仍可抓到完整的視窗畫面 |
sunweb
一般會員 發表:11 回覆:9 積分:4 註冊:2006-07-06 發送簡訊給我 |
不知道,xp是提供哪各api有這功能捏
大大可否告知呢? 找了很久就是找不到捏!謝謝... ===================引 用 bugmans 文 章=================== 後來我注意到一個軟體也有類似功能TaskSwitchXP PChome介紹http://toget.pchome.com.tw/intro/utility_system/utility_system_Optimize/22902.html 官網執行畫面http://www.ntwind.com/software/taskswitchxp/screenshots.html 最重要的是有原始碼可以下載,經過一個月的研究終於發現windows XP以上的版本就有提供這個功能的API 原來TopDesk和TaskSwitchXP只能限定在XP以上的作業系統才能執行原因就是如此 範例執行檔下載http://delphi.ktop.com.tw/download.php?download=upload/462b2d3ecd83c_Project1.exe 執行後會自行開啟記事本而視窗位置在螢幕外,但按下抓圖按鈕後仍可抓到完整的視窗畫面 |
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
|
Kingron
中階會員 發表:1 回覆:51 積分:60 註冊:2005-09-14 發送簡訊給我 |
------
超级猛料:http://kingron.delphibbs.com |
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
Kingron給了正確答案,那我也公佈範例的原始碼,就只是呼叫PrintWindow而已
[code vb] VERSION 5.00 Begin VB.Form Form1 AutoRedraw = -1 'True Caption = "Form1" ClientHeight = 7515 ClientLeft = 1650 ClientTop = 1530 ClientWidth = 10605 LinkTopic = "Form1" ScaleHeight = 7515 ScaleWidth = 10605 Begin VB.CommandButton Command1 Caption = "抓圖" Height = 495 Left = 240 TabIndex = 0 Top = 6720 Width = 1095 End End Attribute VB_Name = "Form1" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = True Attribute VB_Exposed = False Private Declare Function PrintWindow Lib "user32" (ByVal hwnd As Long, ByVal hdcBlt As Long, ByVal nFlags As Long) As Long Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long Private Type OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion As String * 128 End Type Private Const VER_PLATFORM_WIN32s = 0 Private Const VER_PLATFORM_WIN32_WINDOWS = 1 Private Const VER_PLATFORM_WIN32_NT = 2 Dim mWnd As Long Private Sub Command1_Click() Dim info As OSVERSIONINFO info.dwOSVersionInfoSize = Len(info) GetVersionEx info If (info.dwPlatformId = VER_PLATFORM_WIN32_NT And info.dwMajorVersion >= 5 And info.dwMinorVersion >= 1) Then Me.Cls PrintWindow mWnd, Me.hDC, 0 Me.Refresh Else MsgBox "要Windows XP以上的版本才支援" End If End Sub Private Sub Form_Load() Shell "notepad.exe", vbNormalNoFocus mWnd = FindWindow("Notepad", vbNullString) If mWnd = 0 Then MsgBox "失敗" MoveWindow mWnd, -300, 200, 500, 200, 0 'Me.AutoRedraw = True End Sub [/code] |
sunweb
一般會員 發表:11 回覆:9 積分:4 註冊:2006-07-06 發送簡訊給我 |
|
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
|
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
http://forums.microsoft.com/msdn-cht/showpost.aspx?postid=2711456&siteid=14&mode=1&sb=0&d=1&at=7&ft=11&tf=0&pageid=1
假如視窗已經縮到工具列裡,PrintWindow就取不到畫面了,這篇討論提供了可行的作法 出自Capturing Minimized Window: A kid’s trick http://www.codeproject.com/KB/cs/CapturingMinimizedWindow.aspx |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |