1191 lines
35 KiB
C++
1191 lines
35 KiB
C++
//
|
|
// Created by Andrew on 10/04/2023.
|
|
//
|
|
|
|
#include <windows.h>
|
|
#include <commctrl.h>
|
|
#include <mmsystem.h>
|
|
#include <objidl.h>
|
|
#include <gdiplus.h>
|
|
|
|
#include "header.h"
|
|
#include "resource.h"
|
|
|
|
HWND hMainWindow;
|
|
|
|
const WCHAR *pAboutLink = L"https://github.com/Endermanch/XPKeygen",
|
|
*pWebsite = L"https://malwarewatch.org",
|
|
*pVersion = L"2.5",
|
|
*pTitle = L"Windows XP Pro SP3 // Server 2003 SP0 x86 VLK - Enderman[ch]",
|
|
*pGroupTitle = L"Windows XP Pro SP3 // Server 2003 SP0 x86 VLK",
|
|
*pRBText = L"z22 / MSKey / Endermanch ◄ 14/06/2023";
|
|
|
|
bool bServer = false,
|
|
bUpgrade = false,
|
|
bMusic = true;
|
|
|
|
const int w = 615,
|
|
h = 545,
|
|
x = (GetSystemMetrics(SM_CXSCREEN) - w) / 2,
|
|
y = (GetSystemMetrics(SM_CYSCREEN) - h) / 2;
|
|
|
|
/* Hexadecimal edit processor. */
|
|
LRESULT HexEditProc(HWND hWindow, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData) {
|
|
static EDITBALLOONTIP balloonTip;
|
|
|
|
switch (uMsg) {
|
|
case WM_APP + IDC_EDIT1: {
|
|
balloonTip.cbStruct = sizeof(EDITBALLOONTIP);
|
|
balloonTip.pszTitle = L"Unacceptable Character";
|
|
balloonTip.pszText = L"You can only type decimal/hexadecimal numbers here.";
|
|
balloonTip.ttiIcon = TTI_ERROR;
|
|
|
|
break;
|
|
}
|
|
|
|
case WM_CHAR: {
|
|
WCHAR isXPresent[2 + 1]; // 0x and the NULL terminator.
|
|
|
|
WCHAR hexNumber = toupper(wParam);
|
|
ULONG hexLength = SendMessageW(hWindow, WM_GETTEXTLENGTH, 0, 0);
|
|
|
|
SendMessageW(hWindow, WM_GETTEXT, 3, (LPARAM)isXPresent);
|
|
|
|
if (hexNumber >= L'A' && hexNumber <= L'F' && toupper(isXPresent[1]) == 'X' ||
|
|
hexNumber >= L'0' && hexNumber <= L'9' ||
|
|
hexNumber == L'X' && hexLength == 0x01 ||
|
|
hexNumber < L' ' || hexLength == 0x0C) goto forward;
|
|
|
|
SendMessageW(hWindow, EM_SHOWBALLOONTIP, 0, (LPARAM)&balloonTip);
|
|
|
|
break;
|
|
}
|
|
|
|
case WM_NCDESTROY: {
|
|
RemoveWindowSubclass(hWindow, HexEditProc, 1);
|
|
|
|
break;
|
|
}
|
|
|
|
forward:
|
|
default: return DefSubclassProc(hWindow, uMsg, wParam, lParam);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* Bitmap link processor. */
|
|
LRESULT BitmapLinkProc(HWND hWindow, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData) {
|
|
static TRACKMOUSEEVENT trackMouse;
|
|
static BOOL isSet = FALSE;
|
|
|
|
// The worst part here was to avoid pointer flickering, as well as spamming the SetCursor function.
|
|
switch (uMsg) {
|
|
|
|
// Set the struct up outside of a frequently executed message to speed things up.
|
|
case WM_APP + 0x69: {
|
|
trackMouse.cbSize = sizeof(TRACKMOUSEEVENT);
|
|
trackMouse.dwFlags = TME_LEAVE;
|
|
trackMouse.dwHoverTime = HOVER_DEFAULT;
|
|
trackMouse.hwndTrack = hWindow;
|
|
|
|
break;
|
|
}
|
|
|
|
// You have to turn off the WM_SETCURSOR, because it spams the SetCursor function with IDC_ARROW in the DefWndProc. Moist garbage.
|
|
case WM_SETCURSOR: break;
|
|
|
|
// Set cursor to hand if it's inside of static area, refresh the mouse tracking loop.
|
|
case WM_MOUSEMOVE: {
|
|
if (!isSet) {
|
|
TrackMouseEvent(&trackMouse);
|
|
SetCursor(LoadCursorW(nullptr, IDC_HAND));
|
|
|
|
isSet = TRUE;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
// Set cursor back to normal if it's outside of static area.
|
|
case WM_MOUSELEAVE: {
|
|
if (isSet) {
|
|
SetCursor(LoadCursorW(nullptr, IDC_ARROW));
|
|
isSet = FALSE;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
// Remove the subclass before window closes.
|
|
case WM_NCDESTROY: {
|
|
RemoveWindowSubclass(hWindow, (SUBCLASSPROC)BitmapLinkProc, uIdSubclass);
|
|
|
|
break;
|
|
}
|
|
|
|
// Pass everything else to DefWndProc.
|
|
default: return DefSubclassProc(hWindow, uMsg, wParam, lParam);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* Static link processor. */
|
|
LRESULT StaticLinkProc(HWND hWindow, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData) {
|
|
static TRACKMOUSEEVENT trackMouse;
|
|
static BOOL isSet = FALSE;
|
|
|
|
// The worst part here was to avoid pointer flickering, as well as spamming the SetCursor function.
|
|
switch (uMsg) {
|
|
|
|
// Set the struct up outside of a frequently executed message to speed things up.
|
|
case WM_APP + 0x69: {
|
|
trackMouse.cbSize = sizeof(TRACKMOUSEEVENT);
|
|
trackMouse.dwFlags = TME_LEAVE;
|
|
trackMouse.dwHoverTime = HOVER_DEFAULT;
|
|
trackMouse.hwndTrack = hWindow;
|
|
|
|
break;
|
|
}
|
|
|
|
// You have to turn off the WM_SETCURSOR, because it spams the SetCursor function with IDC_ARROW in the DefWndProc. Moist garbage.
|
|
case WM_SETCURSOR: break;
|
|
|
|
// Set cursor to hand if it's inside of static area, refresh the mouse tracking loop.
|
|
case WM_MOUSEMOVE: {
|
|
if (!isSet) {
|
|
TrackMouseEvent(&trackMouse);
|
|
SetCursor(LoadCursorW(nullptr, IDC_HAND));
|
|
|
|
isSet = TRUE;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
// Set cursor back to normal if it's outside of static area.
|
|
case WM_MOUSELEAVE: {
|
|
if (isSet) {
|
|
SetCursor(LoadCursorW(nullptr, IDC_ARROW));
|
|
isSet = FALSE;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
// Remove the subclass before window closes.
|
|
case WM_NCDESTROY: {
|
|
RemoveWindowSubclass(hWindow, (SUBCLASSPROC)StaticLinkProc, uIdSubclass);
|
|
|
|
break;
|
|
}
|
|
|
|
// Pass everything else to DefWndProc.
|
|
default: return DefSubclassProc(hWindow, uMsg, wParam, lParam);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* Combo box processor. */
|
|
LRESULT CALLBACK ComboProc(HWND hWindow, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData) {
|
|
switch (uMsg) {
|
|
case WM_PAINT: {
|
|
// If the combobox isn't dropdown-only, there's no support for it.
|
|
if ((GetWindowLongPtrW(hWindow, GWL_STYLE) & CBS_DROPDOWNLIST) == 0)
|
|
break;
|
|
|
|
RECT rClient;
|
|
PAINTSTRUCT paintStruct;
|
|
BITMAP pBitmap;
|
|
|
|
HDC hClientDC = BeginPaint(hWindow, &paintStruct),
|
|
hCompatDC = CreateCompatibleDC(hClientDC);
|
|
|
|
HBITMAP hDropDownBitmap = LoadBitmapW((HINSTANCE)GetWindowLongPtrW(hWindow, GWLP_HINSTANCE), MAKEINTRESOURCEW(IDB_BITMAP5));
|
|
HBRUSH hBlackBrush = CreateSolidBrush(RGB(0, 0, 0));
|
|
HPEN hPen = CreatePen(PS_SOLID, 1, RGB(128, 128, 128));
|
|
HGDIOBJ hOldBrush = SelectObject(hClientDC, hBlackBrush),
|
|
hOldPen = SelectObject(hClientDC, hPen),
|
|
hOldBitmap = SelectObject(hCompatDC, hDropDownBitmap);
|
|
|
|
// Acquire client coordinates, select current font of the window.
|
|
GetClientRect(hWindow, &rClient);
|
|
SelectObject(hClientDC, (HFONT)SendMessage(hWindow, WM_GETFONT, 0, 0));
|
|
|
|
// Draw border.
|
|
Rectangle(hClientDC, 0, 0, rClient.right, rClient.bottom);
|
|
|
|
// Set background and foreground text colors.
|
|
SetBkColor(hClientDC, RGB(0, 0, 0));
|
|
SetTextColor(hClientDC, RGB(255, 255, 255));
|
|
|
|
// Select bitmap object and copy bits.
|
|
GetObjectW(hDropDownBitmap, sizeof(pBitmap), &pBitmap);
|
|
BitBlt(
|
|
hClientDC,
|
|
rClient.right - (pBitmap.bmWidth + 3),
|
|
rClient.bottom - (rClient.bottom - rClient.top + pBitmap.bmHeight) / 2,
|
|
pBitmap.bmWidth, pBitmap.bmHeight,
|
|
hCompatDC,
|
|
0, 0,
|
|
SRCCOPY
|
|
);
|
|
|
|
// Re-select old bitmap.
|
|
SelectObject(hCompatDC, hOldBitmap);
|
|
|
|
INT nSelect = SendMessageW(hWindow, CB_GETCURSEL, 0, 0);
|
|
|
|
// If an item is selected, we need to draw it as well.
|
|
if (nSelect >= 0) {
|
|
INT nLength = SendMessageW(hWindow, CB_GETLBTEXTLEN, nSelect, 0);
|
|
WCHAR *pBuffer = (WCHAR *)calloc(nLength + NULL_TERMINATOR, sizeof(WCHAR));
|
|
|
|
// Acquire item text.
|
|
SendMessageW(hWindow, CB_GETLBTEXT, nSelect, (LPARAM)pBuffer);
|
|
|
|
// Add left margin and draw text.
|
|
rClient.left += 5;
|
|
DrawTextW(
|
|
hClientDC,
|
|
pBuffer,
|
|
-1,
|
|
&rClient,
|
|
DT_EDITCONTROL | DT_LEFT | DT_VCENTER | DT_SINGLELINE
|
|
);
|
|
|
|
free(pBuffer);
|
|
}
|
|
|
|
// Re-select previous objects.
|
|
SelectObject(hClientDC, hOldPen);
|
|
SelectObject(hClientDC, hOldBrush);
|
|
|
|
// Free memory.
|
|
DeleteObject(hBlackBrush);
|
|
DeleteObject(hPen);
|
|
|
|
EndPaint(hWindow, &paintStruct);
|
|
return 0;
|
|
}
|
|
|
|
case WM_NCDESTROY: {
|
|
RemoveWindowSubclass(hWindow, ComboProc, uIdSubclass);
|
|
break;
|
|
}
|
|
}
|
|
|
|
return DefSubclassProc(hWindow, uMsg, wParam, lParam);
|
|
}
|
|
|
|
/* Main window processor. */
|
|
LRESULT CALLBACK WNDProc(HWND hWindow, UINT uMessage, WPARAM wParam, LPARAM lParam) {
|
|
static HINSTANCE hInstance;
|
|
|
|
static HBRUSH hBGColorPrim, hBGColorSec, hFGColor, hBtnDefault,
|
|
hBtn1Select, hBtn1Hot,
|
|
hBtn2Select, hBtn2Hot,
|
|
hBtn3Select, hBtn3Hot,
|
|
hBtn4Select, hBtn4Hot;
|
|
|
|
static HPEN hFrameColor, hFramePrim, hBtnDefaultP,
|
|
hBtn1SelectP, hBtn1HotP,
|
|
hBtn2SelectP, hBtn2HotP,
|
|
hBtn3SelectP, hBtn3HotP,
|
|
hBtn4SelectP, hBtn4HotP;
|
|
|
|
static HDC hMainDC;
|
|
|
|
static HBITMAP hBMusicOn, hBMusicOff;
|
|
|
|
switch (uMessage) {
|
|
case WM_CREATE:
|
|
bMusic = true;
|
|
|
|
hInstance = ((LPCREATESTRUCT)(lParam))->hInstance;
|
|
hMainDC = GetDC(hWindow);
|
|
|
|
playAudio(hInstance, MAKEINTRESOURCEW(IDR_WAVE1), SND_ASYNC | SND_LOOP | SND_NODEFAULT);
|
|
|
|
hBMusicOn = (HBITMAP)LoadImageW(hInstance, MAKEINTRESOURCEW(IDB_BITMAP3), IMAGE_BITMAP, 0, 0, 0);
|
|
hBMusicOff = (HBITMAP)LoadImageW(hInstance, MAKEINTRESOURCEW(IDB_BITMAP4), IMAGE_BITMAP, 0, 0, 0);
|
|
|
|
hFrameColor = CreatePen(PS_SOLID, 1, RGB(240, 240, 240));
|
|
hFramePrim = CreatePen(PS_SOLID, 1, RGB(10, 10, 10));
|
|
|
|
hBGColorPrim = CreateSolidBrush(RGB(10, 10, 10));
|
|
hBGColorSec = (HBRUSH)(GetStockObject(BLACK_BRUSH));
|
|
hFGColor = (HBRUSH)GetStockObject(WHITE_BRUSH);
|
|
|
|
hBtnDefaultP = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
|
|
|
|
hBtn1SelectP = CreatePen(PS_SOLID, 1, RGB(160, 160, 0));
|
|
hBtn1HotP = CreatePen(PS_SOLID, 1, RGB(80, 80, 0));
|
|
|
|
hBtn2SelectP = CreatePen(PS_SOLID, 1, RGB(0, 0, 160));
|
|
hBtn2HotP = CreatePen(PS_SOLID, 1, RGB(0, 0, 80));
|
|
|
|
hBtn3SelectP = CreatePen(PS_SOLID, 1, RGB(160, 0, 0));
|
|
hBtn3HotP = CreatePen(PS_SOLID, 1, RGB(80, 0, 0));
|
|
|
|
hBtn4SelectP = CreatePen(PS_SOLID, 1, RGB(0, 160, 0));
|
|
hBtn4HotP = CreatePen(PS_SOLID, 1, RGB(0, 80, 0));
|
|
|
|
hBtnDefault = CreateSolidBrush(RGB(30, 30, 30));
|
|
|
|
hBtn1Select = CreateSolidBrush(RGB(70, 70, 30));
|
|
hBtn1Hot = CreateSolidBrush(RGB(40, 40, 30));
|
|
|
|
hBtn2Select = CreateSolidBrush(RGB(30, 30, 70));
|
|
hBtn2Hot = CreateSolidBrush(RGB(30, 30, 40));
|
|
|
|
hBtn3Select = CreateSolidBrush(RGB(70, 30, 30));
|
|
hBtn3Hot = CreateSolidBrush(RGB(40, 30, 30));
|
|
|
|
hBtn4Hot = CreateSolidBrush(RGB(30, 40, 30));
|
|
hBtn4Select = CreateSolidBrush(RGB(30, 70, 30));
|
|
|
|
break;
|
|
|
|
case WM_PAINT: {
|
|
SelectObject(hMainDC, hFrameColor);
|
|
SelectObject(hMainDC, GetStockObject(HOLLOW_BRUSH));
|
|
|
|
RoundRect(hMainDC, 10, 165, w - 26, h - 65, 12, 12);
|
|
InvalidateRect(GetDlgItem(hWindow, IDC_LABEL1), nullptr, true);
|
|
|
|
goto execute;
|
|
}
|
|
|
|
case WM_CTLCOLORSTATIC:
|
|
SetBkMode((HDC)wParam, TRANSPARENT);
|
|
|
|
if ((HWND)lParam == GetDlgItem(hWindow, IDC_EDIT1)) {
|
|
if (bServer)
|
|
SetTextColor((HDC)wParam, RGB(30, 255, 30));
|
|
else
|
|
SetTextColor((HDC)wParam, RGB(255, 255, 0));
|
|
|
|
return (LRESULT)(hBGColorSec);
|
|
}
|
|
else if ((HWND)lParam == GetDlgItem(hWindow, IDC_LABEL4)) {
|
|
SetTextColor((HDC)wParam, RGB(140, 140, 255));
|
|
|
|
return (LRESULT)(hBGColorPrim);
|
|
}
|
|
else if ((HWND)lParam == GetDlgItem(hWindow, IDC_LABEL5)) {
|
|
SetTextColor((HDC)wParam, RGB(255, 140, 140));
|
|
|
|
return (LRESULT)(hBGColorPrim);
|
|
}
|
|
else {
|
|
SetTextColor((HDC)wParam, RGB(255, 255, 255));
|
|
return (LRESULT)(hBGColorPrim);
|
|
}
|
|
|
|
break;
|
|
|
|
case WM_CTLCOLOREDIT:
|
|
SetBkMode((HDC)wParam, TRANSPARENT);
|
|
|
|
if ((HWND)lParam == GetDlgItem(hWindow, IDC_INPUT1)) {
|
|
SetTextColor((HDC)wParam, RGB(255, 140, 140));
|
|
}
|
|
else if ((HWND)lParam == GetDlgItem(hWindow, IDC_INPUT2)) {
|
|
SetTextColor((HDC)wParam, RGB(140, 140, 255));
|
|
}
|
|
else if ((HWND)lParam == GetDlgItem(hWindow, IDC_INPUT3)) {
|
|
SetTextColor((HDC)wParam, RGB(255, 255, 140));
|
|
}
|
|
else if ((HWND)lParam == GetDlgItem(hWindow, IDC_COMBO1)) {
|
|
SetTextColor((HDC)wParam, RGB(255, 255, 255));
|
|
}
|
|
else goto execute;
|
|
|
|
return (LRESULT)(hBGColorSec);
|
|
|
|
case WM_CTLCOLORLISTBOX: {
|
|
COMBOBOXINFO hComboBoxInfo{};
|
|
|
|
hComboBoxInfo.cbSize = sizeof(hComboBoxInfo);
|
|
SendDlgItemMessageW(hWindow, IDC_COMBO1, CB_GETCOMBOBOXINFO, 0, (LPARAM)&hComboBoxInfo);
|
|
|
|
SetBkMode((HDC)wParam, TRANSPARENT);
|
|
|
|
if ((HWND)lParam == hComboBoxInfo.hwndList) {
|
|
SetTextColor((HDC)wParam, RGB(255, 255, 255));
|
|
}
|
|
|
|
return (LRESULT)(hBGColorSec);
|
|
}
|
|
|
|
case WM_NOTIFY: {
|
|
LPNMHDR nmHeader = (LPNMHDR)lParam;
|
|
|
|
if (nmHeader->code == NM_CUSTOMDRAW) {
|
|
LPNMCUSTOMDRAW item = (LPNMCUSTOMDRAW)nmHeader;
|
|
|
|
HBRUSH hBtnXSelect, hBtnXHot;
|
|
HPEN hBtnXSelectP, hBtnXHotP;
|
|
|
|
CONST WCHAR *pCaption = L"Unknown";
|
|
|
|
switch (nmHeader->idFrom) {
|
|
case IDC_BUTTON1:
|
|
pCaption = L"About";
|
|
|
|
hBtnXSelect = hBtn1Select;
|
|
hBtnXHot = hBtn1Hot;
|
|
hBtnXSelectP = hBtn1SelectP;
|
|
hBtnXHotP = hBtn1HotP;
|
|
|
|
break;
|
|
|
|
case IDC_BUTTON2:
|
|
pCaption = L"> Generate <";
|
|
|
|
hBtnXSelect = hBtn2Select;
|
|
hBtnXHot = hBtn2Hot;
|
|
hBtnXSelectP = hBtn2SelectP;
|
|
hBtnXHotP = hBtn2HotP;
|
|
|
|
break;
|
|
|
|
case IDC_BUTTON3:
|
|
pCaption = L"Quit";
|
|
|
|
hBtnXSelect = hBtn3Select;
|
|
hBtnXHot = hBtn3Hot;
|
|
hBtnXSelectP = hBtn3SelectP;
|
|
hBtnXHotP = hBtn3HotP;
|
|
|
|
break;
|
|
|
|
case IDC_BUTTON4:
|
|
pCaption = L"Random";
|
|
|
|
hBtnXSelect = hBtn4Select;
|
|
hBtnXHot = hBtn4Hot;
|
|
hBtnXSelectP = hBtn4SelectP;
|
|
hBtnXHotP = hBtn4HotP;
|
|
|
|
break;
|
|
|
|
default:
|
|
return CDRF_DODEFAULT;
|
|
}
|
|
|
|
SetBkMode(item->hdc, TRANSPARENT);
|
|
SetTextColor(item->hdc, RGB(255, 255, 255));
|
|
|
|
SelectObject(item->hdc, hFramePrim);
|
|
SelectObject(item->hdc, hBGColorPrim);
|
|
|
|
Rectangle(item->hdc, item->rc.left, item->rc.top, item->rc.right, item->rc.bottom);
|
|
|
|
if (item->uItemState & CDIS_SELECTED) {
|
|
SelectObject(item->hdc, hBtnXSelectP);
|
|
SelectObject(item->hdc, hBtnXSelect);
|
|
}
|
|
else if (item->uItemState & CDIS_HOT) {
|
|
SelectObject(item->hdc, hBtnXHotP);
|
|
SelectObject(item->hdc, hBtnXHot);
|
|
}
|
|
else {
|
|
SelectObject(item->hdc, hBtnDefaultP);
|
|
SelectObject(item->hdc, hBtnDefault);
|
|
}
|
|
|
|
RoundRect(item->hdc, item->rc.left, item->rc.top, item->rc.right, item->rc.bottom, 12, 12);
|
|
DrawTextW(item->hdc, pCaption, -1, &item->rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
|
|
|
|
return CDRF_SKIPDEFAULT;
|
|
}
|
|
|
|
return CDRF_DODEFAULT;
|
|
}
|
|
|
|
case WM_COMMAND:
|
|
switch (LOWORD(wParam)) {
|
|
case IDC_IMAGE2: {
|
|
switch (HIWORD(wParam)) {
|
|
case STN_CLICKED:
|
|
if (bMusic) {
|
|
SendMessageW((HWND)lParam, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBMusicOff);
|
|
stopAudio();
|
|
|
|
bMusic = false;
|
|
}
|
|
else {
|
|
SendMessageW((HWND)lParam, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBMusicOn);
|
|
playAudio(hInstance, MAKEINTRESOURCEW(IDR_WAVE1), SND_ASYNC | SND_LOOP | SND_NODEFAULT);
|
|
|
|
bMusic = true;
|
|
}
|
|
break;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
case IDC_LABEL4: {
|
|
switch (HIWORD(wParam)) {
|
|
case STN_CLICKED:
|
|
ShellExecuteW(hWindow, L"open", pWebsite, nullptr, nullptr, SW_SHOWNORMAL);
|
|
|
|
break;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
case IDC_COMBO1:
|
|
switch (HIWORD(wParam)) {
|
|
case CBN_SELCHANGE:
|
|
int nSelect = SendMessageW((HWND)lParam, CB_GETCURSEL, 0, 0);
|
|
|
|
switch (nSelect) {
|
|
case 0:
|
|
EnableWindow(GetDlgItem(hMainWindow, IDC_INPUT2), true);
|
|
EnableWindow(GetDlgItem(hMainWindow, IDC_INPUT3), false);
|
|
|
|
bServer = false;
|
|
break;
|
|
|
|
case 1:
|
|
EnableWindow(GetDlgItem(hMainWindow, IDC_INPUT2), false);
|
|
EnableWindow(GetDlgItem(hMainWindow, IDC_INPUT3), true);
|
|
|
|
bServer = true;
|
|
break;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
break;
|
|
|
|
case IDC_LABEL2: {
|
|
switch (HIWORD(wParam)) {
|
|
case STN_CLICKED:
|
|
SendDlgItemMessageW(hWindow, IDC_CHECK1, BM_SETCHECK, !SendDlgItemMessageW(hWindow, IDC_CHECK1, BM_GETCHECK, 0, 0), 0);
|
|
|
|
break;
|
|
}
|
|
|
|
__fallthrough;
|
|
}
|
|
|
|
case IDC_CHECK1:
|
|
switch (HIWORD(wParam)) {
|
|
case BN_CLICKED:
|
|
bUpgrade = IsDlgButtonChecked(hWindow, IDC_CHECK1);
|
|
|
|
break;
|
|
}
|
|
|
|
break;
|
|
|
|
/*
|
|
case IDC_LABEL3: {
|
|
switch (HIWORD(wParam)) {
|
|
case STN_CLICKED:
|
|
CheckRadioButton(hWindow, IDC_RADIO1, IDC_RADIO2, IDC_RADIO2);
|
|
|
|
break;
|
|
}
|
|
|
|
__fallthrough;
|
|
}
|
|
|
|
case IDC_RADIO2:
|
|
switch (HIWORD(wParam)) {
|
|
case BN_CLICKED:
|
|
EnableWindow(GetDlgItem(hMainWindow, IDC_BUTTON4), false);
|
|
|
|
EnableWindow(GetDlgItem(hMainWindow, IDC_INPUT1), false);
|
|
EnableWindow(GetDlgItem(hMainWindow, IDC_INPUT2), false);
|
|
|
|
bServer = true;
|
|
|
|
break;
|
|
}
|
|
|
|
break;
|
|
*/
|
|
|
|
case IDC_BUTTON1: {
|
|
ShellExecuteW(hWindow, L"open", pAboutLink, nullptr, nullptr, SW_SHOWNORMAL);
|
|
|
|
break;
|
|
}
|
|
|
|
case IDC_BUTTON2: {
|
|
WCHAR *pText = (WCHAR *)calloc(512, sizeof(WCHAR)),
|
|
pBSection[4]{}, pCSection[8]{}, pAuthSection[8]{};
|
|
|
|
HWND hInput1 = GetDlgItem(hMainWindow, IDC_INPUT1),
|
|
hInput2 = GetDlgItem(hMainWindow, IDC_INPUT2),
|
|
hEdit = GetDlgItem(hMainWindow, IDC_EDIT1);
|
|
|
|
SendMessageW(hInput1, WM_GETTEXT, 3 + NULL_TERMINATOR, (LPARAM)pBSection);
|
|
SendMessageW(hInput2, WM_GETTEXT, 6 + NULL_TERMINATOR, (LPARAM)pCSection);
|
|
|
|
if (bServer) {
|
|
HWND hInput3 = GetDlgItem(hMainWindow, IDC_INPUT3);
|
|
|
|
SendMessageW(hInput3, WM_GETTEXT, 5 + NULL_TERMINATOR, (LPARAM)pAuthSection);
|
|
formatServer(bUpgrade, pBSection, pAuthSection, pText);
|
|
}
|
|
else {
|
|
formatXP(bUpgrade, pBSection, pCSection, pText);
|
|
}
|
|
|
|
SendMessageW(hEdit, WM_SETTEXT, 0, (LPARAM)pText);
|
|
free(pText);
|
|
|
|
return 0;
|
|
}
|
|
|
|
case IDC_BUTTON3: {
|
|
DestroyWindow(hWindow);
|
|
|
|
return 0;
|
|
}
|
|
|
|
case IDC_BUTTON4: {
|
|
DWORD nChannelID = randomRange(1, 999),
|
|
nSequence = randomRange(0, 999'999);
|
|
|
|
WCHAR pBSection[4]{}, pCSection[8]{};
|
|
|
|
wsprintfW(pBSection, L"%03d", nChannelID);
|
|
wsprintfW(pCSection, L"%06d", nSequence);
|
|
|
|
SendMessageW(GetDlgItem(hMainWindow, IDC_INPUT1), WM_SETTEXT, 0, (LPARAM)pBSection);
|
|
if (!bServer) SendMessageW(GetDlgItem(hMainWindow, IDC_INPUT2), WM_SETTEXT, 0, (LPARAM)pCSection);
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
case WM_CLOSE:
|
|
DestroyWindow(hWindow);
|
|
|
|
break;
|
|
|
|
case WM_DESTROY:
|
|
DeleteObject(hBGColorPrim);
|
|
|
|
DeleteObject(hBtn1Select);
|
|
DeleteObject(hBtn1Hot);
|
|
DeleteObject(hBtn2Select);
|
|
DeleteObject(hBtn2Hot);
|
|
DeleteObject(hBtn3Select);
|
|
DeleteObject(hBtn3Hot);
|
|
DeleteObject(hBtn4Select);
|
|
DeleteObject(hBtn4Hot);
|
|
|
|
DeleteObject(hBtnDefault);
|
|
|
|
DeleteObject(hBtn1SelectP);
|
|
DeleteObject(hBtn1HotP);
|
|
DeleteObject(hBtn2SelectP);
|
|
DeleteObject(hBtn2HotP);
|
|
DeleteObject(hBtn3SelectP);
|
|
DeleteObject(hBtn3HotP);
|
|
DeleteObject(hBtn4SelectP);
|
|
DeleteObject(hBtn4HotP);
|
|
|
|
DeleteObject(hBtnDefaultP);
|
|
|
|
DeleteObject(hFrameColor);
|
|
DeleteObject(hFramePrim);
|
|
|
|
ReleaseDC(hWindow, hMainDC);
|
|
|
|
PostQuitMessage(0);
|
|
break;
|
|
|
|
execute:
|
|
default:
|
|
return DefWindowProc(hWindow, uMessage, wParam, lParam);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* Initialize system fonts. */
|
|
void InitializeFonts(HFONT *hLabelFont, HFONT *hSmolFont, HFONT *hBoldFont, HFONT *hCaptionFont) {
|
|
NONCLIENTMETRICSW nonClientMetrics;
|
|
|
|
// Get information about the default system font.
|
|
nonClientMetrics.cbSize = sizeof(NONCLIENTMETRICSW);
|
|
SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSW), &nonClientMetrics, 0);
|
|
|
|
ULONG defaultHeight = nonClientMetrics.lfMessageFont.lfHeight;
|
|
|
|
// Create default font.
|
|
*hLabelFont = CreateFontIndirectW(&nonClientMetrics.lfMessageFont);
|
|
|
|
// Create smol font.
|
|
nonClientMetrics.lfMessageFont.lfHeight = 12;
|
|
*hSmolFont = CreateFontIndirectW(&nonClientMetrics.lfMessageFont);
|
|
|
|
// Create bold font.
|
|
nonClientMetrics.lfMessageFont.lfWeight = 700;
|
|
nonClientMetrics.lfMessageFont.lfHeight = defaultHeight;
|
|
*hBoldFont = CreateFontIndirectW(&nonClientMetrics.lfMessageFont);
|
|
|
|
// Create caption font.
|
|
nonClientMetrics.lfMessageFont.lfHeight = 30;
|
|
*hCaptionFont = CreateFontIndirectW(&nonClientMetrics.lfMessageFont);
|
|
}
|
|
|
|
/* Initialize main window. */
|
|
bool InitializeWindow(HINSTANCE hInstance) {
|
|
HFONT hLabelFont,
|
|
hSmolFont,
|
|
hCaptionFont,
|
|
hBoldFont;
|
|
|
|
WNDCLASSEX wndClass{};
|
|
|
|
// Register the main window class.
|
|
wndClass.cbSize = sizeof(WNDCLASSEX);
|
|
wndClass.hInstance = hInstance;
|
|
wndClass.lpfnWndProc = (WNDPROC)WNDProc;
|
|
wndClass.lpszClassName = L"XPKeygen";
|
|
wndClass.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(10, 10, 10));
|
|
wndClass.style = CS_HREDRAW | CS_VREDRAW;
|
|
wndClass.hIcon = LoadIconW(nullptr, MAKEINTRESOURCEW(IDI_ICON1));
|
|
wndClass.hIconSm = LoadIconW(hInstance, MAKEINTRESOURCEW(IDI_ICON1));
|
|
wndClass.hCursor = LoadCursorW(nullptr, IDC_ARROW);
|
|
|
|
if (!RegisterClassExW(&wndClass))
|
|
return false;
|
|
|
|
InitializeFonts(&hLabelFont, &hSmolFont, &hBoldFont, &hCaptionFont);
|
|
|
|
hMainWindow = CreateWindowExW(
|
|
0,
|
|
L"XPKeygen",
|
|
pTitle,
|
|
WS_SYSMENU,
|
|
x, y,
|
|
w, h,
|
|
nullptr,
|
|
nullptr,
|
|
hInstance,
|
|
nullptr
|
|
);
|
|
|
|
HDC hMainDC = GetDC(hMainWindow);
|
|
|
|
// Select the default font.
|
|
SelectObject(hMainDC, hLabelFont);
|
|
|
|
HBITMAP hBLogo = (HBITMAP)LoadImageW(hInstance, MAKEINTRESOURCEW(IDB_BITMAP2), IMAGE_BITMAP, 0, 0, 0);
|
|
|
|
HWND hLogo = CreateWindowExW(
|
|
0,
|
|
L"Static", nullptr,
|
|
WS_CHILD | WS_VISIBLE |
|
|
SS_BITMAP | SS_REALSIZEIMAGE,
|
|
0, 0,
|
|
600, 0,
|
|
hMainWindow, (HMENU)IDC_IMAGE1,
|
|
hInstance, nullptr
|
|
);
|
|
|
|
SendMessageW(hLogo, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBLogo);
|
|
|
|
HBITMAP hBMusicOn = (HBITMAP)LoadImageW(hInstance, MAKEINTRESOURCEW(IDB_BITMAP3), IMAGE_BITMAP, 0, 0, 0),
|
|
hBMusicOff = (HBITMAP)LoadImageW(hInstance, MAKEINTRESOURCEW(IDB_BITMAP4), IMAGE_BITMAP, 0, 0, 0);
|
|
|
|
HWND hMusic = CreateWindowExW(
|
|
0,
|
|
L"Static", nullptr,
|
|
WS_CHILD | WS_VISIBLE |
|
|
SS_BITMAP | SS_REALSIZECONTROL |
|
|
SS_NOTIFY,
|
|
w - 67, 180,
|
|
32, 32,
|
|
hMainWindow, (HMENU)IDC_IMAGE2,
|
|
hInstance, nullptr
|
|
);
|
|
|
|
SendMessageW(hMusic, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBMusicOn);
|
|
|
|
SetWindowSubclass(hMusic, (SUBCLASSPROC)BitmapLinkProc, IDC_IMAGE2, 0);
|
|
SendMessageW(hMusic, WM_APP + 0x69, 0, 0);
|
|
|
|
HWND hGroupBox = CreateWindowExW(
|
|
0,
|
|
L"Static", pGroupTitle,
|
|
WS_CHILD | WS_VISIBLE |
|
|
SS_CENTER,
|
|
42, 150,
|
|
515, 32,
|
|
hMainWindow, (HMENU)IDC_LABEL1,
|
|
hInstance, nullptr
|
|
);
|
|
|
|
SendMessageW(hGroupBox, WM_SETFONT, (WPARAM)hCaptionFont, 0);
|
|
|
|
HWND hVersionLabel = CreateWindowExW(
|
|
0,
|
|
L"Static", L"Version:",
|
|
WS_CHILD | WS_VISIBLE,
|
|
20, 190,
|
|
50, 16,
|
|
hMainWindow, nullptr,
|
|
hInstance, nullptr
|
|
);
|
|
|
|
SendMessageW(hVersionLabel, WM_SETFONT, (WPARAM)hBoldFont, 0);
|
|
|
|
HWND hComboBox = CreateWindowExW(
|
|
0,
|
|
WC_COMBOBOX,
|
|
L"",
|
|
WS_CHILD | WS_VISIBLE | WS_OVERLAPPED | WS_BORDER | WS_TABSTOP |
|
|
CBS_DROPDOWNLIST | CBS_HASSTRINGS,
|
|
70, 190 - 2,
|
|
400, 20,
|
|
hMainWindow,
|
|
(HMENU)IDC_COMBO1,
|
|
hInstance, nullptr
|
|
);
|
|
|
|
SetWindowSubclass(hComboBox, (SUBCLASSPROC)ComboProc, IDC_COMBO1, 0);
|
|
|
|
SendMessageW(hComboBox, WM_SETFONT, (WPARAM)hLabelFont, 0);
|
|
|
|
SendMessageW(hComboBox, CB_ADDSTRING, 0, (LPARAM)L"Windows XP (SP0 - SP3)");
|
|
SendMessageW(hComboBox, CB_ADDSTRING, 0, (LPARAM)L"Windows Server 2003 (SP0)");
|
|
|
|
SendMessageW(hComboBox, CB_SETCURSEL, 0, 0);
|
|
|
|
HWND hUpgrade = CreateWindowExW(
|
|
WS_EX_WINDOWEDGE,
|
|
L"Button",
|
|
L"",
|
|
WS_VISIBLE | WS_CHILD | WS_TABSTOP |
|
|
BS_AUTOCHECKBOX,
|
|
480, 190 - 1,
|
|
17, 20,
|
|
hMainWindow,
|
|
(HMENU)IDC_CHECK1,
|
|
hInstance, nullptr
|
|
);
|
|
|
|
SendMessageW(hUpgrade, WM_SETFONT, (WPARAM)hLabelFont, 0);
|
|
|
|
HWND hUpgradeLabel = CreateWindowExW(
|
|
0,
|
|
L"Static",
|
|
L"Upgrade",
|
|
WS_CHILD | WS_VISIBLE |
|
|
SS_NOTIFY,
|
|
497, 190 + 1,
|
|
50, 16,
|
|
hMainWindow, (HMENU)IDC_LABEL2,
|
|
hInstance, nullptr
|
|
);
|
|
|
|
SendMessageW(hUpgradeLabel, WM_SETFONT, (WPARAM)hLabelFont, 0);
|
|
|
|
/*HWND hRadio1 = CreateWindowExW(
|
|
WS_EX_WINDOWEDGE,
|
|
L"Button",
|
|
L"",
|
|
WS_VISIBLE | WS_CHILD | WS_GROUP | WS_TABSTOP |
|
|
BS_AUTORADIOBUTTON,
|
|
70, 190 - 1,
|
|
17, 20,
|
|
hMainWindow,
|
|
(HMENU)IDC_RADIO1,
|
|
hInstance, nullptr
|
|
);
|
|
|
|
SendMessageW(hRadio1, BM_SETCHECK, 1, 0);
|
|
SendMessageW(hRadio1, WM_SETFONT, (WPARAM)hLabelFont, 0);
|
|
|
|
HWND hRadioLabel1 = CreateWindowExW(
|
|
0,
|
|
L"Static",
|
|
L"Windows XP VLK",
|
|
WS_CHILD | WS_VISIBLE |
|
|
SS_NOTIFY,
|
|
89, 190 + 1,
|
|
90, 16,
|
|
hMainWindow, (HMENU)IDC_LABEL2,
|
|
hInstance, nullptr
|
|
);
|
|
|
|
SendMessageW(hRadioLabel1, WM_SETFONT, (WPARAM)hLabelFont, 0);
|
|
|
|
HWND hRadio2 = CreateWindowExW(
|
|
WS_EX_WINDOWEDGE,
|
|
L"Button",
|
|
L"",
|
|
WS_VISIBLE | WS_CHILD | WS_TABSTOP |
|
|
BS_AUTORADIOBUTTON,
|
|
200, 190 - 1,
|
|
17, 20,
|
|
hMainWindow,
|
|
(HMENU)IDC_RADIO2,
|
|
hInstance, nullptr);
|
|
|
|
SendMessageW(hRadio2, WM_SETFONT, (WPARAM)hLabelFont, 0);
|
|
|
|
HWND hRadioLabel2 = CreateWindowExW(
|
|
0,
|
|
L"Static",
|
|
L"Windows Server 2003 VLK",
|
|
WS_CHILD | WS_VISIBLE |
|
|
SS_NOTIFY,
|
|
218, 190 + 1,
|
|
142, 16,
|
|
hMainWindow, (HMENU)IDC_LABEL3,
|
|
hInstance, nullptr
|
|
);
|
|
|
|
SendMessageW(hRadioLabel2, WM_SETFONT, (WPARAM)hLabelFont, 0);*/
|
|
|
|
HWND hSerialLabel = CreateWindowExW(
|
|
0,
|
|
L"Static", L"Serial:",
|
|
WS_CHILD | WS_VISIBLE,
|
|
20, 220 + 1,
|
|
50, 16,
|
|
hMainWindow, nullptr,
|
|
hInstance, nullptr
|
|
);
|
|
|
|
SendMessageW(hSerialLabel, WM_SETFONT, (WPARAM)hBoldFont, 0);
|
|
|
|
HWND hChannelID = CreateWindowExW(
|
|
0,
|
|
L"Edit",
|
|
L"",
|
|
WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP |
|
|
ES_LEFT | ES_NUMBER,
|
|
70, 220 - 1,
|
|
40, 20,
|
|
hMainWindow,
|
|
(HMENU)IDC_INPUT1,
|
|
hInstance,
|
|
nullptr
|
|
);
|
|
|
|
SendMessageW(hChannelID, EM_SETCUEBANNER, 0, (LPARAM)L"BBB");
|
|
SendMessageW(hChannelID, WM_SETTEXT, 0, (LPARAM)L"640");
|
|
SendMessageW(hChannelID, WM_SETFONT, (WPARAM)hLabelFont, 0);
|
|
|
|
SendMessageW(hChannelID, EM_SETLIMITTEXT, (WPARAM)3, 0);
|
|
|
|
HWND hSerialDash = CreateWindowExW(
|
|
0,
|
|
L"Static", L"-",
|
|
WS_CHILD | WS_VISIBLE,
|
|
113, 220,
|
|
10, 16,
|
|
hMainWindow, nullptr,
|
|
hInstance, nullptr
|
|
);
|
|
|
|
SendMessageW(hSerialDash, WM_SETFONT, (WPARAM)hBoldFont, 0);
|
|
|
|
HWND hSequence = CreateWindowExW(
|
|
0,
|
|
L"Edit",
|
|
L"",
|
|
WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP |
|
|
ES_LEFT | ES_NUMBER,
|
|
121, 220 - 1,
|
|
70, 20,
|
|
hMainWindow,
|
|
(HMENU)IDC_INPUT2,
|
|
hInstance,
|
|
nullptr
|
|
);
|
|
|
|
SendMessageW(hSequence, EM_SETCUEBANNER, 0, (LPARAM)L"CCCCCC");
|
|
SendMessageW(hSequence, WM_SETTEXT, 0, (LPARAM)L"883400");
|
|
SendMessageW(hSequence, WM_SETFONT, (WPARAM)hLabelFont, 0);
|
|
|
|
SendMessageW(hSequence, EM_SETLIMITTEXT, (WPARAM)6, 0);
|
|
|
|
HWND hRandomize = CreateWindowExW(
|
|
0,
|
|
L"Button",
|
|
L"Randomize",
|
|
WS_CHILD | WS_VISIBLE | WS_TABSTOP,
|
|
200, 220 - 2,
|
|
75, 22,
|
|
hMainWindow,
|
|
(HMENU)IDC_BUTTON4,
|
|
hInstance,
|
|
nullptr
|
|
);
|
|
|
|
SendMessageW(hRandomize, WM_SETFONT, (WPARAM)hLabelFont, 0);
|
|
|
|
HWND hAuthInfoLabel = CreateWindowExW(
|
|
0,
|
|
L"Static", L"AuthInfo:",
|
|
WS_CHILD | WS_VISIBLE,
|
|
290, 220 + 1,
|
|
70, 16,
|
|
hMainWindow, nullptr,
|
|
hInstance, nullptr
|
|
);
|
|
|
|
SendMessageW(hAuthInfoLabel, WM_SETFONT, (WPARAM)hBoldFont, 0);
|
|
|
|
HWND hAuthInfo = CreateWindowExW(
|
|
0,
|
|
L"Edit",
|
|
L"",
|
|
WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP |
|
|
WS_DISABLED | ES_LEFT,
|
|
350, 220 - 1,
|
|
50, 20,
|
|
hMainWindow,
|
|
(HMENU)IDC_INPUT3,
|
|
hInstance,
|
|
nullptr
|
|
);
|
|
|
|
SetWindowSubclass(hAuthInfo, HexEditProc, IDC_EDIT1, 0);
|
|
|
|
SendMessageW(hAuthInfo, EM_SETCUEBANNER, 0, (LPARAM)L"0 - 1023");
|
|
SendMessageW(hAuthInfo, EM_SETLIMITTEXT, (WPARAM)5, 0);
|
|
|
|
SendMessageW(hAuthInfo, WM_SETTEXT, 0, (LPARAM)L"0x1A4");
|
|
|
|
SendMessageW(hAuthInfo, WM_APP + IDC_EDIT1, 0, 0);
|
|
SendMessageW(hAuthInfo, WM_SETFONT, (WPARAM)hLabelFont, 0);
|
|
|
|
HWND hEdit = CreateWindowExW(
|
|
0,
|
|
L"Edit",
|
|
L"",
|
|
WS_CHILD | WS_VISIBLE | WS_BORDER |
|
|
ES_MULTILINE | ES_READONLY |
|
|
ES_LEFT,
|
|
20, 250,
|
|
w - 57, h - 360,
|
|
hMainWindow,
|
|
(HMENU)IDC_EDIT1,
|
|
hInstance,
|
|
nullptr
|
|
);
|
|
|
|
SendMessageW(hEdit, WM_SETFONT, (WPARAM)hBoldFont, 0);
|
|
|
|
HWND hInfo = CreateWindowExW(
|
|
0,
|
|
L"Button",
|
|
L"About",
|
|
WS_CHILD | WS_VISIBLE | WS_TABSTOP |
|
|
BS_PUSHBUTTON,
|
|
44, h - 102,
|
|
100, 27,
|
|
hMainWindow,
|
|
(HMENU)IDC_BUTTON1,
|
|
hInstance,
|
|
nullptr
|
|
);
|
|
|
|
SendMessageW(hInfo, WM_SETFONT, (WPARAM)hLabelFont, 0);
|
|
|
|
HWND hGenerate = CreateWindowExW(
|
|
0,
|
|
L"Button",
|
|
L"Generate",
|
|
WS_CHILD | WS_VISIBLE | WS_TABSTOP |
|
|
BS_PUSHBUTTON,
|
|
250, h - 102,
|
|
100, 27,
|
|
hMainWindow,
|
|
(HMENU)IDC_BUTTON2,
|
|
hInstance,
|
|
nullptr
|
|
);
|
|
|
|
SendMessageW(hGenerate, WM_SETFONT, (WPARAM)hLabelFont, 0);
|
|
|
|
HWND hQuit = CreateWindowExW(
|
|
0,
|
|
L"Button",
|
|
L"Quit",
|
|
WS_CHILD | WS_VISIBLE | WS_TABSTOP |
|
|
BS_PUSHBUTTON,
|
|
w - 160, h - 102,
|
|
100, 27,
|
|
hMainWindow,
|
|
(HMENU)IDC_BUTTON3,
|
|
hInstance,
|
|
nullptr
|
|
);
|
|
|
|
SendMessageW(hQuit, WM_SETFONT, (WPARAM)hLabelFont, 0);
|
|
|
|
WCHAR pVersionString[256]{};
|
|
|
|
wsprintfW(pVersionString, L"v%s • %s", pVersion, pWebsite);
|
|
|
|
HWND hVersion = CreateWindowExW(
|
|
0,
|
|
L"Static",
|
|
pVersionString,
|
|
WS_CHILD | WS_VISIBLE |
|
|
SS_NOTIFY,
|
|
10, h - 58,
|
|
170, 16,
|
|
hMainWindow, (HMENU)IDC_LABEL4,
|
|
hInstance, nullptr
|
|
);
|
|
|
|
SetWindowSubclass(hVersion, (SUBCLASSPROC)StaticLinkProc, IDC_LABEL4, 0);
|
|
|
|
SendMessageW(hVersion, WM_SETFONT, (WPARAM)hSmolFont, 0);
|
|
SendMessageW(hVersion, WM_APP + 0x69, 0, 0);
|
|
|
|
HWND hBRText = CreateWindowExW(
|
|
0,
|
|
L"Static",
|
|
pRBText,
|
|
WS_CHILD | WS_VISIBLE,
|
|
w - (173 + 20), h - 58,
|
|
173, 16,
|
|
hMainWindow, (HMENU)IDC_LABEL5,
|
|
hInstance, nullptr
|
|
);
|
|
|
|
SendMessageW(hBRText, WM_SETFONT, (WPARAM)hSmolFont, 0);
|
|
|
|
ShowWindow(hMainWindow, SW_SHOW);
|
|
UpdateWindow(hMainWindow);
|
|
|
|
MSG uMessage;
|
|
|
|
while(GetMessageW(&uMessage, nullptr, 0, 0)) {
|
|
if (!IsDialogMessageW(hMainWindow, &uMessage)) {
|
|
TranslateMessage(&uMessage);
|
|
DispatchMessageW(&uMessage);
|
|
}
|
|
}
|
|
|
|
ReleaseDC(hMainWindow, hMainDC);
|
|
|
|
return true;
|
|
} |