Сегодня я перешел на Visual Studio (C ++) 2013, я много раз использовал кодоблоки, но понял, что кодовые блоки начинают давать сбой при компиляции некоторых кодов, подобных этому:
//#define _WIN32_WINNT 0x0500
#include "hMain.h"#include <windows.h>
#include <Uxtheme.h>
int Width = 800;
int Height = 600;
const MARGINS* Margin = { 0, 0, Width , Height };
char lWindowName[256] = "TEEEST";
HWND hWnd;
char tWindowName[256] = "TEEEST";
HWND tWnd;
RECT tSize;
MSG Message;
LRESULT CALLBACK WinProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch (Message)
{
case WM_PAINT:
Render ();
break;
case WM_CREATE:
DwmExtendFrameIntoClientArea(hWnd, Margin);
break;
case WM_COMMAND:
if (wParam == VK_ESCAPE) PostQuitMessage(0);
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hWnd, Message, wParam, lParam);
break;
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hSecInstance, LPSTR nCmdLine, INT nCmdShow)
{
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)SetWindowToTarget, 0, 0, 0);
WNDCLASSEX wClass;
wClass.cbClsExtra = NULL;
wClass.cbSize = sizeof(WNDCLASSEX);
wClass.cbWndExtra = NULL;
wClass.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(0, 0, 0));
wClass.hCursor = LoadCursor(0, IDC_ARROW);
wClass.hIcon = LoadIcon(0, IDI_APPLICATION);
wClass.hIconSm = LoadIcon(0, IDI_APPLICATION);
wClass.hInstance = hInstance;
wClass.lpfnWndProc = WinProc;
wClass.lpszClassName = (LPCWSTR)lWindowName;
wClass.lpszMenuName = (LPCWSTR)lWindowName;
wClass.style = CS_VREDRAW | CS_HREDRAW;
if(!RegisterClassEx(&wClass))
exit(1);
tWnd = FindWindow(0, (LPCWSTR)tWindowName);
if (tWnd)
{
GetWindowRect(tWnd, &tSize);
Width = tSize.right - tSize.left;
Height = tSize.bottom - tSize.top;
hWnd = CreateWindowEx(WS_EX_TOPMOST | WS_EX_TRANSPARENT | WS_EX_LAYERED, (LPCWSTR)lWindowName, (LPCWSTR)lWindowName, WS_POPUP, 1, 1, Width, Height, 0, 0, 0, 0);
SetLayeredWindowAttributes(hWnd, 0, 1.0f, LWA_ALPHA);
SetLayeredWindowAttributes(hWnd, 0, RGB(0, 0, 0), LWA_COLORKEY);
ShowWindow( hWnd, SW_SHOW);
}
DirectXInit(hWnd);
for (;;)
{
if (GetAsyncKeyState(VK_ESCAPE)) break;
if(PeekMessage(&Message, hWnd, 0, 0, PM_REMOVE))
{
DispatchMessage(&Message);
TranslateMessage(&Message);
}
Sleep(1);
}
return 0;
}
void SetWindowToTarget()
{
while(true)
{
tWnd = FindWindow(0, (LPCWSTR)tWindowName);
if (tWnd)
{
GetWindowRect(tWnd, &tSize);
Width = tSize.right - tSize.left;
Height = tSize.bottom - tSize.top;
DWORD dwStyle = GetWindowLong(tWnd, GWL_STYLE);
if(dwStyle & WS_BORDER)
{
tSize.top += 23;
Height -= 23;
}
MoveWindow(hWnd, tSize.left, tSize.top, Width, Height, true);
}
else
{
char* ErrorMsg[125];
MessageBox(0, L"MAL", (LPCWSTR)L"Error - Cannot find the game!", MB_OK | MB_ICONERROR);
exit(1);
}
Sleep(100);
}
}
Итак, 2 вопроса. Во-первых, как я могу исправить эту ошибку компилятора: http://gyazo.com/6d7de9e0f3bad345dbbe7b9b80c90b8d И второй вопрос. Я понял, что я должен поставить «L» и (LPCWSTR) перед некоторыми символами *, это на 100% требуется? Есть ли способ избежать этого хотя бы (LPCWSTR)? Спасибо, что прочитали.
Первый,
const MARGINS* Margin = { 0, 0, Width , Height };
является недействительным. Вы, вероятно, хотите создать новый MARGINS
объект и инициализировать его с заданными значениями, в этом случае вы не хотите Margin
быть указателем:
const MARGINS Margin = { 0, 0, Width , Height };
Во-вторых, DwmExtendFrameIntoClientArea()
ожидает const MARGINS*
, который является указателем на MARGINS
объект. Просто дайте ему адрес Margin
:
DwmExtendFrameIntoClientArea(hWnd, &Margin);
Что касается проблем с широкими символами, я предполагаю, что вы компилируете это с «набором символов Unicode» в опциях проекта. В этом случае большинство строк в Windows API будут указателями на широкие символы (wchar_t*
). Однако вы выделяете узкие массивы символов (например, lWindowName
) и приведение их к указателю на wchar_t
:
wClass.lpszClassName = (LPCWSTR)lWindowName;
Это даст вам все виды странного поведения. Убедитесь, что ваши строки действительно сделаны из широких символов:
wchar_t lWindowName[256] = L"TEEEST";
Это позволит вам отказаться от большинства бросков.