2009-12-15 57 views
1

在Windows中,似乎至少有兩種方法可以訪問幀緩衝區:GDI和DirectX。如何創建一個讀取幀緩衝區並將內容保存爲圖像的模塊

的問題是,爲了使用GDI或DirectX,似乎你必須運行一個GUI應用程序,然後從該應用程序可以調用適當的GDI和DirectX功能。例如:

#include <windows.h> 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
    // Insert frame buffer reading via GDI here. 
    return 0; 
} 

但是,我正在創建一個模塊,它將包含一個函數,它將讀取幀緩衝區的內容並將其保存爲圖像。該模塊將與更大的應用程序鏈接。

那麼,我將如何創建這個模塊,而不必運行一個實際的GUI應用程序?

+0

這幀緩衝?每個窗口都有它自己的,窗口管理器每個顯示至少有一個... – Bahbar 2009-12-16 08:15:02

+0

保存整個桌面的幀緩衝區。 – bob 2009-12-16 16:38:38

+0

當Windows 2000引入多個分層窗口並且Vista中默認啓用桌面組合時,情況就不再如此了 – 2009-12-16 19:36:10

回答

1

你不需要的WinMain()使用GDI - 只是鏈接到適當的庫和你去好。

您可以創建用於創建窗口的控制檯應用程序。 WinMain()沒有特別的需要。如果您需要HINSTANCE,您可以撥打GetModuleHandle(NULL)

1

它真的不那麼簡單。對於一個GDI和DirectX,使用完全不同的方式來存儲幀緩衝區信息。

攔截的DirectX緩衝,例如,你需要攔截的DirectX調用,然後存在時被稱爲搶幀緩衝到一個文件中。

1

如果我正確地讀你的問題,它聽起來就像你想要寫一個控制檯應用程序(非GUI)將執行的屏幕截圖。如果是這樣,只需google屏幕截圖,你會發現各種各樣的代碼示例,所有這些代碼都執行幾乎相同的步驟,使用GetDC(0)獲取桌面的HDC,然後使用BitBlt作爲源DC到您創建的內存位圖的DC中,然後將您的位圖寫入磁盤。請注意,在控制檯應用程序中執行此操作非常簡單,而從NT服務執行此操作不是。另外,某些應用程序(視頻,OpenGL等)的客戶端區域在沒有額外工作變得非常繁瑣的情況下不會被捕獲。

的另一種方法是讓你的應用程序使用SendKeys API函數來模擬SHIFT + PRINTSCREEN,然後檢索剪貼板並寫入文件。

如果您使用的是C,請使用此代碼而不是SendKeys。

// Simulate press of "Shift+PrintScrn"... 
keybd_event(VK_SHIFT, 0, 0, 0); 
keybd_event(VK_SNAPSHOT, 0, 0, 0); 
// then release... 
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0); 
keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0);