簡體   English   中英

我有一個win32 Windows應用程序,想要捕獲全屏並刪除顯示的窗口邊框嗎?

[英]i have a win32 windows application and want to capture full screen and remove the border of window displayed?

Win32 Windows應用程序,想要捕獲全屏並刪除顯示的窗口邊框,任何人告訴我,如果此窗口捕獲鼠標鍵盤控件,那該怎么辦呢?

// MonitorScreen.cpp : Defines the entry point for the application. //

#include "stdafx.h" 
#include "MonitorScreen.h

#define MAX_LOADSTRING 100

// Global Variables: HINSTANCE hInst;                               // current instance TCHAR szTitle[MAX_LOADSTRING];                  // The title bar text TCHAR szWindowClass[MAX_LOADSTRING];          // the main window class name

// Forward declarations of functions included in this code module: ATOM             MyRegisterClass(HINSTANCE hInstance); BOOL              InitInstance(HINSTANCE, int); LRESULT CALLBACK  WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK   About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow) {  UNREFERENCED_PARAMETER(hPrevInstance);  UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: Place code here.   MSG msg;    HACCEL hAccelTable;

    // Initialize global strings    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);  LoadString(hInstance, IDC_MONITORSCREEN, szWindowClass, MAX_LOADSTRING);    MyRegisterClass(hInstance);

    // Perform application initialization:  if (!InitInstance (hInstance, nCmdShow))    {       return FALSE;   }

    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MONITORSCREEN));

    // Main message loop:   while (GetMessage(&msg, NULL, 0, 0))    {       if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))         {           TranslateMessage(&msg);             DispatchMessage(&msg);      }   }

    return (int) msg.wParam; }



// //  FUNCTION: MyRegisterClass() // //  PURPOSE: Registers the window class. // //  COMMENTS: // //    This function and its usage are only necessary if you want this code //    to be compatible with Win32 systems prior to the 'RegisterClassEx' //    function that was added to Windows 95. It is important to call this function //    so that the application will get 'well formed' small icons associated //    with it. // ATOM MyRegisterClass(HINSTANCE hInstance) {     WNDCLASSEX wcex;

    int s =sizeof(WNDCLASSEX);  wcex.cbSize =sizeof(WNDCLASSEX);

    wcex.style          = DESKTOP_HOOKCONTROL  ;//CS_HREDRAW | CS_VREDRAW;  wcex.lpfnWndProc    = WndProc;  wcex.cbClsExtra     = 0;    wcex.cbWndExtra     = 0;    wcex.hInstance      = NULL;//hInstance;     wcex.hIcon          = NULL;//LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MONITORSCREEN));   wcex.hCursor        = NULL;//LoadCursor(NULL, IDC_ARROW);   wcex.hbrBackground  = (HBRUSH)(9);  wcex.lpszMenuName   = NULL;//MAKEINTRESOURCE(IDC_MONITORSCREEN);    wcex.lpszClassName  = szWindowClass;    wcex.hIconSm        = NULL;//LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassEx(&wcex); }

// //   FUNCTION: InitInstance(HINSTANCE, int) // //   PURPOSE: Saves instance handle and creates main window // //   COMMENTS: // //        In this function, we save the instance handle in a global variable and //        create and display the main program window. // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) {    HWND hWnd;

   hInst = hInstance; // Store instance handle in our global variable

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)    {
      return FALSE;    }

   ShowWindow(hWnd, nCmdShow);    UpdateWindow(hWnd);

   return TRUE; }

// //  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM) // //  PURPOSE:  Processes messages for the main window. // //  WM_COMMAND - process the application menu //  WM_PAINT - Paint the main window //  WM_DESTROY  - post a quit message and return // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {    int wmId, wmEvent;  PAINTSTRUCT ps;     HDC hdc;

    switch (message)    {   case WM_COMMAND:        wmId    = LOWORD(wParam);       wmEvent
= HIWORD(wParam);       // Parse the menu selections:       switch (wmId)       {       case IDM_ABOUT:             DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);           break;      case IDM_EXIT:          DestroyWindow(hWnd);            break;      default:            return DefWindowProc(hWnd, message, wParam, lParam);        }       break;  case WM_PAINT:      hdc = BeginPaint(hWnd, &ps);        // TODO: Add any drawing code here...       EndPaint(hWnd, &ps);        break;  case WM_DESTROY:        PostQuitMessage(0);         break;  default:        return DefWindowProc(hWnd, message, wParam, lParam);    }   return 0; }

// Message handler for about box. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {   UNREFERENCED_PARAMETER(lParam);     switch (message)    {   case WM_INITDIALOG:         return (INT_PTR)TRUE;

    case WM_COMMAND:        if (LOWORD(wParam)
== IDOK || LOWORD(wParam) == IDCANCEL)      {           EndDialog(hDlg, LOWORD(wParam));            return (INT_PTR)TRUE;       }       break;  }   return (INT_PTR)FALSE; }

在Google上發現了此問題: 屏幕捕獲,C / C ++的困難...嘗試理解代碼並根據需要進行調整。

void CaptureScreen(LPCTSTR lpszFilePathName)
{
      BITMAPFILEHEADER      bmfHeader;
      BITMAPINFO                  *pbminfo;
      HBITMAP                        hBMP;
      CFile                        oFile;

      CDC            *pDC            = GetWindowDC();
      INT            nSizeImage      = 1024 * 768 * 3;
      CHAR      *pBuff            = new CHAR[sizeof(BITMAPINFOHEADER) + nSizeImage];
      pbminfo                        = (BITMAPINFO *)pBuff;
      hBMP                        = (HBITMAP)pDC->GetCurrentBitmap()->m_hObject;

      ZeroMemory(pbminfo, sizeof(BITMAPINFO));

      pbminfo->bmiHeader.biSize            = sizeof(BITMAPINFOHEADER);

      GetDIBits(pDC->m_hDC,
                    hBMP,
                    0,
                    1,
                    NULL,
                    pbminfo,
                    DIB_RGB_COLORS);

      GetDIBits(pDC->m_hDC,
                    hBMP,
                    0,
                    pbminfo->bmiHeader.biHeight,
                    pBuff + sizeof(BITMAPINFOHEADER),
                    pbminfo,
                    DIB_RGB_COLORS);

      ReleaseDC(pDC);

      bmfHeader.bfType            = 0x4d42; /*"BM"*/
      bmfHeader.bfSize            = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + nSizeImage;
      bmfHeader.bfReserved1      = 0;
      bmfHeader.bfReserved2      = 0;
      bmfHeader.bfOffBits            = (DWORD) sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

      oFile.Open(lpszFilePathName, CFile::modeWrite | CFile::modeCreate);

      oFile.Write(&bmfHeader, sizeof(BITMAPFILEHEADER));
      oFile.Write(pBuff, sizeof(BITMAPINFOHEADER) + pbminfo->bmiHeader.biSizeImage);
      delete []pBuff;
      oFile.Close();
}

我假設您實際上並不想捕獲屏幕,您的問題沒有道理。 我猜您只是想使窗口最大化以占據全屏。 將模板生成的代碼恢復原樣,只需更改ShowWindow調用即可:

 ShowWindow(hWnd, SW_MAXIMIZE);

我認為您想使用OpenGL或DirectX並為您的應用程序調用全屏模式。 當然會有一些您無法攔截的按鍵,例如安全注意序列(通常是CTRL + ALT + DEL),但是與計算機的大多數交互都將直接針對您的程序。

首先要獲得全屏,您應該在其中鍵入以下內容:ShowWindow(hWnd,SW_SHOWMAXIMIZED)第二個要刪除邊框或女巫的窗口樣式被稱為粗框,您應該在CreateWindow函數中鍵入(放置樣式的地方(WS_ )):CreateWindow(您的類,窗口名稱,WS_POPUP | WS_BORDER,用於創建窗口功能的其余參數。);

Ps:WS_BORDER只是一個1 PX黑色邊框,因此如果窗口未最小化,您可以知道窗口在哪里,並且在窗口頂部具有相同的bg顏色,並且只要有需要就可以刪除它,而且您也無法將其最小化,最大化,使用內置按鈕關閉窗口,因為它們不會在那里,因此如果您要關閉應用程序,只需按下一個按鈕即可發送PostQuitMessage。

祝好運

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM