#pragma once
class CWinBase
{
public:
CWinBase();
~CWinBase();
HWND m_hWnd;
HINSTANCE m_hInstance;
//int x = CW_USEDEFAULT, int y = 0, int nWidth = CW_USEDEFAULT,
//int nHeight = 0, DWORD dwStyle = WS_OVERLAPPEDWINDOW, HWND hWndParent
BOOL CreateWnd(LPCWSTR lpWindowName = NULL, int x = CW_USEDEFAULT, int y = 0,
int nWidth = CW_USEDEFAULT, int nHeight = 0, DWORD dwStyle = WS_OVERLAPPEDWINDOW);
virtual LRESULT WndProc(UINT message, WPARAM wParam, LPARAM lParam);
private:
#pragma pack(push,1)
typedef struct _StdCallThunk
{
DWORD m_mov; // = 0x042444C7
DWORD m_this; // = this
BYTE m_jmp; // = 0xe9
DWORD m_relproc; // = relative distance
} StdCallThunk;
#pragma pack(pop)
WCHAR* m_szClassName;
StdCallThunk *m_pStdthunk;
static LRESULT CALLBACK sWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
static LRESULT CALLBACK StaticWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
};
#include "stdafx.h"
#include "WinBase.h"
CWinBase::CWinBase(){
m_pStdthunk = (StdCallThunk *)VirtualAlloc(NULL, sizeof(StdCallThunk),
MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
m_hWnd = NULL;
m_hInstance = GetModuleHandle(NULL);
m_szClassName = MAKEINTATOM(StaticWndProc);
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = sWndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = m_hInstance;
wcex.hIcon = LoadIcon(m_hInstance, MAKEINTRESOURCE(32512));
wcex.hIconSm = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = m_szClassName;
RegisterClassEx(&wcex);
m_pStdthunk->m_mov = 0x042444c7;
m_pStdthunk->m_jmp = 0xe9;
m_pStdthunk->m_this = (DWORD)this;
m_pStdthunk->m_relproc = (DWORD)StaticWndProc - ((DWORD)m_pStdthunk + sizeof(StdCallThunk));
}
CWinBase::~CWinBase(){
VirtualFree(m_pStdthunk, sizeof(StdCallThunk), MEM_RELEASE);
}
BOOL CWinBase::CreateWnd(LPCWSTR lpWindowName, int x, int y, int nWidth, int nHeight, DWORD dwStyle){
if (m_hWnd != NULL)
{
return FALSE;
}
m_hWnd = CreateWindow(m_szClassName, lpWindowName, dwStyle,
x, y, nWidth, nHeight, NULL, NULL, m_hInstance, NULL);
SetWindowLong(m_hWnd, GWL_WNDPROC, (LONG)m_pStdthunk);
return TRUE;
}
LRESULT CALLBACK CWinBase::sWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
switch (message)
{
case WM_CREATE:
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
LRESULT CALLBACK CWinBase::StaticWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
return ((CWinBase *)hWnd)->WndProc(message, wParam, lParam);
}
LRESULT CWinBase::WndProc(UINT message, WPARAM wParam, LPARAM lParam){
return DefWindowProc(m_hWnd, message, wParam, lParam);
}