913 lines
27 KiB
C++
913 lines
27 KiB
C++
#include <iostream>
|
|
#include <Windows.h>
|
|
#include <d3d11.h>
|
|
#include <d3dcompiler.h>
|
|
#include <wrl/client.h>
|
|
#include "bkg.h"
|
|
#include "Utils/Utils.h"
|
|
#include "Utils/H264Encoder.h"
|
|
|
|
#include "ImGuiDatePicker.h"
|
|
#include "ImHelper.h"
|
|
|
|
#include "DXGIDuplicator.h"
|
|
|
|
#pragma comment(lib, "d3d11.lib")
|
|
#pragma comment(lib, "d3dcompiler.lib")
|
|
|
|
//#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
|
|
ID3D11ShaderResourceView* image = NULL;
|
|
ID3D11Texture2D* texture2D = NULL;
|
|
|
|
DXGIDuplicator* duplicator = NULL;
|
|
std::string UserName = "";
|
|
enum class TabClass
|
|
{
|
|
KeySerach,
|
|
KeyCreater,
|
|
KeySerachEx,
|
|
KeyTypes,
|
|
UserInfo,
|
|
|
|
};
|
|
#define _SL ImGui::SameLine()
|
|
#define u8s(x) reinterpret_cast<const char*>(u8##x)
|
|
HWND hwnd;
|
|
ID3D11Device* g_pd3dDevice = NULL;
|
|
ID3D11DeviceContext* g_pImmediateContext = NULL;
|
|
ID3D11RenderTargetView* g_pRenderTargetView = NULL;
|
|
IDXGISwapChain* g_pSwapChain = NULL;
|
|
void InitD3D(HWND hWnd) {
|
|
DXGI_SWAP_CHAIN_DESC sd;
|
|
ZeroMemory(&sd, sizeof(sd));
|
|
sd.BufferCount = 1;
|
|
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
|
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
|
|
sd.OutputWindow = hWnd;
|
|
sd.SampleDesc.Count = 1;
|
|
sd.Windowed = TRUE;
|
|
|
|
D3D_FEATURE_LEVEL featureLevel;
|
|
const D3D_FEATURE_LEVEL featureLevels[] = { D3D_FEATURE_LEVEL_11_0 };
|
|
|
|
D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, featureLevels, 1,
|
|
D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &featureLevel, &g_pImmediateContext);
|
|
}
|
|
void InitImGui() {
|
|
IMGUI_CHECKVERSION();
|
|
ImGui::CreateContext();
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
(void)io;
|
|
ImGui_ImplWin32_Init(hwnd);
|
|
ImGui_ImplDX11_Init(g_pd3dDevice, g_pImmediateContext);
|
|
ImGui_ImplDX11_CreateDeviceObjects();
|
|
ImGui::GetIO().ImeWindowHandle = hwnd;
|
|
}
|
|
void CleanupImGui() {
|
|
ImGui_ImplDX11_Shutdown();
|
|
ImGui_ImplWin32_Shutdown();
|
|
ImGui::DestroyContext();
|
|
}
|
|
TabClass CurrentTab = TabClass::KeySerach;
|
|
void LoginFrame(SIZE windowSize)
|
|
{
|
|
HRESULT hr = duplicator->GetDesktopFrame(texture2D);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if (image)
|
|
{
|
|
image->Release();
|
|
image = NULL;
|
|
}
|
|
//auto cnv = duplicator->ConvertFormat(texture2D, DXGI_FORMAT_B8G8R8A8_UNORM);
|
|
//auto bytes = duplicator->GenerateBitmapFile(cnv);
|
|
//File::WriteAllBytes("I:\\bmp.bmp", bytes);
|
|
//cnv->Release();
|
|
image = LoadImageFromTexture(texture2D);
|
|
texture2D->Release();
|
|
}
|
|
if (image)
|
|
{
|
|
const int ln = 1;
|
|
for (int x = 0; x < ln; x++)
|
|
{
|
|
for (int y = 0; y < ln; y++)
|
|
{
|
|
ImGui::SetCursorPos(ImVec2(((float)windowSize.cx / (float)ln) * (float)x, ((float)windowSize.cy / (float)ln) * (float)y));
|
|
ImGui::Image(image, ImVec2((float)windowSize.cx / (float)ln, (float)windowSize.cy / (float)ln),
|
|
ImVec2(0, 0),
|
|
ImVec2(1, 1),
|
|
ImVec4(1, 1, 1, 1),
|
|
ImVec4(1, 0, 0, 1));
|
|
}
|
|
}
|
|
}
|
|
static char uname[0x1000]{};
|
|
static char pwd[0x1000]{};
|
|
|
|
const int input_width = 250;
|
|
ImGui::SetCursorPosY(windowSize.cy * 0.3f);
|
|
ImGui::SetCursorPosX((windowSize.cx - input_width) / 2.0f);
|
|
ImGui::Text(u8s("账号"));
|
|
|
|
ImGui::PushItemWidth((windowSize.cx - 15) * 0.5f);
|
|
ImGui::SetCursorPosX((windowSize.cx - input_width) / 2.0f);
|
|
ImGui::SetNextItemWidth(input_width);
|
|
ImGui::InputText(u8s("##uname"), uname, 0x1000);
|
|
|
|
ImGui::PopItemWidth();
|
|
|
|
ImGui::SetCursorPosX((windowSize.cx - input_width) / 2.0f);
|
|
ImGui::Text(u8s("密码"));
|
|
|
|
ImGui::PushItemWidth((windowSize.cx - 15) * 0.5f);
|
|
ImGui::SetCursorPosX((windowSize.cx - input_width) / 2.0f);
|
|
ImGui::SetNextItemWidth(input_width);
|
|
ImGui::InputText(u8s("##pwd"), pwd, 0x1000, ImGuiInputTextFlags_Password);
|
|
|
|
ImGui::PopItemWidth();
|
|
|
|
ImGui::SetCursorPosX((windowSize.cx - ImGui::CalcTextSize(u8s("登录")).x) / 2.0f);
|
|
if (ImGui::Button(u8s("登录")))
|
|
{
|
|
UserName = uname;
|
|
}
|
|
}
|
|
void KeyCreateFrame(SIZE windowSize)
|
|
{
|
|
_SL;
|
|
static int cur_create_cardType = 0;
|
|
static int cur_create_card_num = 1;
|
|
static char input_info[0x100]{};
|
|
static std::vector<std::string> views_create_cardType =
|
|
{
|
|
u8s("测试1"),
|
|
u8s("测试2"),
|
|
u8s("测试3"),
|
|
};
|
|
if (cur_create_card_num < 1)
|
|
cur_create_card_num = 1;
|
|
ImGui::Text(u8s("类型"));
|
|
ImGui::SetNextItemWidth(150);
|
|
_SL;
|
|
if (ImGui::BeginCombo("##create_cardType", views_create_cardType[cur_create_cardType].c_str()))
|
|
{
|
|
for (int n = 0; n < views_create_cardType.size(); n++) {
|
|
bool is_selected = (cur_create_cardType == n);
|
|
if (ImGui::Selectable(views_create_cardType[n].c_str(), is_selected)) {
|
|
cur_create_cardType = n;
|
|
}
|
|
if (is_selected) {
|
|
ImGui::SetItemDefaultFocus();
|
|
}
|
|
}
|
|
ImGui::EndCombo();
|
|
}
|
|
_SL;
|
|
ImGui::Text(u8s("数量"));
|
|
_SL;
|
|
ImGui::SetNextItemWidth(100);
|
|
ImGui::InputInt("##input_create_card_num", &cur_create_card_num);
|
|
_SL;
|
|
ImGui::Text(u8s("备注"));
|
|
_SL;
|
|
ImGui::SetNextItemWidth(250);
|
|
ImGui::InputText("##input_create_card_info", input_info, 0x100);
|
|
_SL;
|
|
if (ImGui::Button(u8s("生成##bt_create_card")))
|
|
{
|
|
}
|
|
_SL;
|
|
if (ImGui::Button(u8s("复制##bt_create_card_copy")))
|
|
{
|
|
}
|
|
if (ImGui::BeginTable(u8s("##keyCreateTable"), 1, ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable))
|
|
{
|
|
ImGui::TableSetupColumn(u8s("##table_card_create"), ImGuiTableColumnFlags_WidthFixed);
|
|
for (int i = 0; i < 100; i++)
|
|
{
|
|
ImGui::TableNextRow();
|
|
|
|
ImGui::TableSetColumnIndex(0);
|
|
ImGui::Text("XXXXXX-XXXXXXXX-XXXXXXXX");
|
|
}
|
|
ImGui::EndTable();
|
|
}
|
|
}
|
|
void KeySerachFrame(SIZE windowSize)
|
|
{
|
|
static bool _checked = false;
|
|
static char text[0x10000]{};
|
|
ImGui::Text(u8s("卡密(一行一条)"));
|
|
ImGui::InputTextMultiline(u8s("##l1"), text, 0x10000, ImVec2((windowSize.cx - 15), windowSize.cy * 0.25f));
|
|
if (ImGui::Button(u8s("查询##serach"))) {
|
|
}
|
|
ImGui::BeginChild(u8s("##keyList"), ImVec2(windowSize.cx - 15, windowSize.cy * 0.5f), true, ImGuiWindowFlags_HorizontalScrollbar);
|
|
{
|
|
if (ImGui::BeginTable(u8s("##keySerachTable"), 12, ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable))
|
|
{
|
|
ImGui::TableSetupColumn(u8s("##table_sel"), ImGuiTableColumnFlags_WidthFixed);
|
|
ImGui::TableSetupColumn(u8s("卡密"), ImGuiTableColumnFlags_WidthFixed);
|
|
ImGui::TableSetupColumn(u8s("类型"), ImGuiTableColumnFlags_WidthFixed);
|
|
ImGui::TableSetupColumn(u8s("创建时间"), ImGuiTableColumnFlags_WidthFixed);
|
|
ImGui::TableSetupColumn(u8s("启用时间"), ImGuiTableColumnFlags_WidthFixed);
|
|
ImGui::TableSetupColumn(u8s("到期时间"), ImGuiTableColumnFlags_WidthFixed);
|
|
|
|
ImGui::TableSetupColumn(u8s(" "), ImGuiTableColumnFlags_WidthFixed);
|
|
ImGui::TableSetupColumn(u8s(" "), ImGuiTableColumnFlags_WidthFixed);
|
|
|
|
ImGui::TableSetupColumn(u8s(" "), ImGuiTableColumnFlags_WidthFixed);
|
|
ImGui::TableSetupColumn(u8s(" "), ImGuiTableColumnFlags_WidthFixed);
|
|
ImGui::TableSetupColumn(u8s(" "), ImGuiTableColumnFlags_WidthFixed);
|
|
ImGui::TableSetupColumn(u8s(" "), ImGuiTableColumnFlags_WidthFixed);
|
|
ImGui::TableHeadersRow();
|
|
for (int i = 0; i < 100; i++)
|
|
{
|
|
ImGui::TableNextRow();
|
|
|
|
ImGui::TableSetColumnIndex(0);
|
|
ImGui::Checkbox(StringHelper::Format(u8s("##ck%d"), i).c_str(), &_checked);
|
|
|
|
ImGui::TableSetColumnIndex(1);
|
|
ImGui::Text(u8s("卡密"));
|
|
|
|
ImGui::TableSetColumnIndex(2);
|
|
ImGui::Text(u8s("周卡"));
|
|
|
|
ImGui::TableSetColumnIndex(3);
|
|
ImGui::Text(u8s("2024-8-24 17:45:05"));
|
|
|
|
ImGui::TableSetColumnIndex(4);
|
|
ImGui::Text(u8s("2024-8-24 17:45:05"));
|
|
|
|
ImGui::TableSetColumnIndex(5);
|
|
ImGui::Text(u8s("2024-8-24 17:45:05"));
|
|
|
|
ImGui::TableSetColumnIndex(6);
|
|
if (ImGui::Button(StringHelper::Format(u8s("复制##copy_%d"), i).c_str()))
|
|
{
|
|
MessageBoxA(NULL, std::to_string(i).c_str(), std::to_string(i).c_str(), MB_OK);
|
|
}
|
|
ImGui::TableSetColumnIndex(7);
|
|
if (ImGui::Button(StringHelper::Format(u8s("复制一行##copy_line_%d"), i).c_str()))
|
|
{
|
|
MessageBoxA(NULL, std::to_string(i).c_str(), std::to_string(i).c_str(), MB_OK);
|
|
}
|
|
|
|
ImGui::TableSetColumnIndex(8);
|
|
if (ImGui::Button(StringHelper::Format(u8s("解绑##unbind_%d"), i).c_str()))
|
|
{
|
|
MessageBoxA(NULL, std::to_string(i).c_str(), std::to_string(i).c_str(), MB_OK);
|
|
}
|
|
|
|
ImGui::TableSetColumnIndex(9);
|
|
if (ImGui::Button(StringHelper::Format(u8s("禁用##disable_%d"), i).c_str()))
|
|
{
|
|
MessageBoxA(NULL, std::to_string(i).c_str(), std::to_string(i).c_str(), MB_OK);
|
|
}
|
|
|
|
ImGui::TableSetColumnIndex(10);
|
|
if (ImGui::Button(StringHelper::Format(u8s("启用##enable_%d"), i).c_str()))
|
|
{
|
|
MessageBoxA(NULL, std::to_string(i).c_str(), std::to_string(i).c_str(), MB_OK);
|
|
}
|
|
|
|
ImGui::TableSetColumnIndex(11);
|
|
if (ImGui::Button(StringHelper::Format(u8s("删除##delete_%d"), i).c_str()))
|
|
{
|
|
MessageBoxA(NULL, std::to_string(i).c_str(), std::to_string(i).c_str(), MB_OK);
|
|
}
|
|
}
|
|
ImGui::EndTable();
|
|
}
|
|
|
|
ImGui::EndChild();
|
|
if (ImGui::Button(u8s("全选##keyList_all_sel")))
|
|
{
|
|
}
|
|
_SL;
|
|
if (ImGui::Button(u8s("全不选##keyList_cl_sel")))
|
|
{
|
|
}
|
|
static int addTime = 0;
|
|
ImGui::SetNextItemWidth(120);
|
|
ImGui::InputInt(u8s("##keyList_in_time"), &addTime);
|
|
static int cur_unit = 1;
|
|
const char* views[] =
|
|
{
|
|
u8s("分"),
|
|
u8s("时"),
|
|
u8s("天"),
|
|
};
|
|
_SL; ImGui::SetNextItemWidth(60);
|
|
if (ImGui::BeginCombo("##add_time_unit", views[cur_unit])) {
|
|
for (int n = 0; n < 3; n++) {
|
|
bool is_selected = (cur_unit == n);
|
|
if (ImGui::Selectable(views[n], is_selected)) {
|
|
cur_unit = n;
|
|
}
|
|
if (is_selected) {
|
|
ImGui::SetItemDefaultFocus();
|
|
}
|
|
}
|
|
ImGui::EndCombo();
|
|
}
|
|
_SL;
|
|
if (ImGui::Button(u8s("批量加时##keyList_add_time")))
|
|
{
|
|
uint64_t time_of_minutes = addTime * (
|
|
cur_unit == 0 ? 1 :
|
|
cur_unit == 1 ? 60 :
|
|
cur_unit == 2 ? 60 * 24 :
|
|
0
|
|
);
|
|
}
|
|
if (ImGui::Button(u8s("启用##keyList_enable")))
|
|
{
|
|
}
|
|
_SL;
|
|
if (ImGui::Button(u8s("禁用##keyList_disable")))
|
|
{
|
|
}
|
|
_SL;
|
|
if (ImGui::Button(u8s("解绑##keyList_unbind")))
|
|
{
|
|
}
|
|
_SL;
|
|
if (ImGui::Button(u8s("删除##keyList_delete")))
|
|
{
|
|
}
|
|
}
|
|
}
|
|
void KeySerachFrameEx(SIZE windowSize)
|
|
{
|
|
static tm from_time;
|
|
static tm to_time;
|
|
if (from_time.tm_year == 0)
|
|
{
|
|
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
|
|
std::time_t currentTime = std::chrono::system_clock::to_time_t(now);
|
|
gmtime_s(&from_time, ¤tTime);
|
|
gmtime_s(&to_time, ¤tTime);
|
|
}
|
|
ImGui::Text(u8s("时间范围:"));
|
|
|
|
static int cur_sel_time_type = 0;
|
|
static std::vector<std::string> views_sel_time_type =
|
|
{
|
|
u8s("不限"),
|
|
u8s("创建时间"),
|
|
u8s("启用时间"),
|
|
u8s("到期时间"),
|
|
};
|
|
ImGui::SetNextItemWidth(100);
|
|
_SL;
|
|
if (ImGui::BeginCombo("##sel_time_type", views_sel_time_type[cur_sel_time_type].c_str()))
|
|
{
|
|
for (int n = 0; n < views_sel_time_type.size(); n++) {
|
|
bool is_selected = (cur_sel_time_type == n);
|
|
if (ImGui::Selectable(views_sel_time_type[n].c_str(), is_selected)) {
|
|
cur_sel_time_type = n;
|
|
}
|
|
if (is_selected) {
|
|
ImGui::SetItemDefaultFocus();
|
|
}
|
|
}
|
|
ImGui::EndCombo();
|
|
}
|
|
|
|
|
|
_SL; ImGui::Text(u8s("从"));
|
|
|
|
ImGui::SetNextItemWidth(200);
|
|
_SL; ImGui::DatePicker("##pick_date_from", from_time);
|
|
|
|
_SL; ImGui::Text(u8s("到"));
|
|
|
|
ImGui::SetNextItemWidth(200);
|
|
_SL; ImGui::DatePicker("##pick_date_to", to_time);
|
|
|
|
{
|
|
static int cur_sel_card_type = 0;
|
|
static std::vector<std::string> views_sel_card_type =
|
|
{
|
|
u8s("全部"),
|
|
u8s("周卡"),
|
|
u8s("月卡"),
|
|
u8s("年卡"),
|
|
};
|
|
ImGui::Text(u8s("卡密类型:"));
|
|
ImGui::SetNextItemWidth(100);
|
|
_SL;
|
|
if (ImGui::BeginCombo("##sel_card_type", views_sel_card_type[cur_sel_card_type].c_str()))
|
|
{
|
|
for (int n = 0; n < views_sel_card_type.size(); n++) {
|
|
bool is_selected = (cur_sel_card_type == n);
|
|
if (ImGui::Selectable(views_sel_card_type[n].c_str(), is_selected)) {
|
|
cur_sel_card_type = n;
|
|
}
|
|
if (is_selected) {
|
|
ImGui::SetItemDefaultFocus();
|
|
}
|
|
}
|
|
ImGui::EndCombo();
|
|
}
|
|
}
|
|
{
|
|
_SL;
|
|
static int cur_sel_card_state = 0;
|
|
static std::vector<std::string> views_sel_card_state =
|
|
{
|
|
u8s("全部"),
|
|
u8s("启用"),
|
|
u8s("禁用"),
|
|
};
|
|
ImGui::Text(u8s("禁用状态:"));
|
|
ImGui::SetNextItemWidth(100);
|
|
_SL;
|
|
if (ImGui::BeginCombo("##sel_card_state", views_sel_card_state[cur_sel_card_state].c_str()))
|
|
{
|
|
for (int n = 0; n < views_sel_card_state.size(); n++) {
|
|
bool is_selected = (cur_sel_card_state == n);
|
|
if (ImGui::Selectable(views_sel_card_state[n].c_str(), is_selected)) {
|
|
cur_sel_card_state = n;
|
|
}
|
|
if (is_selected) {
|
|
ImGui::SetItemDefaultFocus();
|
|
}
|
|
}
|
|
ImGui::EndCombo();
|
|
}
|
|
}
|
|
{
|
|
_SL;
|
|
static int cur_sel_card_activate = 0;
|
|
static std::vector<std::string> views_sel_card_activate =
|
|
{
|
|
u8s("全部"),
|
|
u8s("已激活"),
|
|
u8s("未激活"),
|
|
};
|
|
ImGui::Text(u8s("激活状态:"));
|
|
ImGui::SetNextItemWidth(100);
|
|
_SL;
|
|
if (ImGui::BeginCombo("##sel_card_activate", views_sel_card_activate[cur_sel_card_activate].c_str()))
|
|
{
|
|
for (int n = 0; n < views_sel_card_activate.size(); n++) {
|
|
bool is_selected = (cur_sel_card_activate == n);
|
|
if (ImGui::Selectable(views_sel_card_activate[n].c_str(), is_selected)) {
|
|
cur_sel_card_activate = n;
|
|
}
|
|
if (is_selected) {
|
|
ImGui::SetItemDefaultFocus();
|
|
}
|
|
}
|
|
ImGui::EndCombo();
|
|
}
|
|
}
|
|
|
|
{
|
|
static char text[0x10000]{};
|
|
ImGui::Text(u8s("备注信息:"));
|
|
ImGui::SetNextItemWidth(200);
|
|
_SL; ImGui::InputText(u8s("##input_info"), text, 0x10000);
|
|
|
|
static int cur_sel_card_owner = 0;
|
|
static std::vector<std::string> views_sel_card_owner =
|
|
{
|
|
u8s("当前账户"),
|
|
u8s("当前账户及所有下级"),
|
|
};
|
|
_SL; ImGui::Text(u8s("所属账户:"));
|
|
ImGui::SetNextItemWidth(200);
|
|
_SL;
|
|
if (ImGui::BeginCombo("##sel_card_owner", views_sel_card_owner[cur_sel_card_owner].c_str()))
|
|
{
|
|
for (int n = 0; n < views_sel_card_owner.size(); n++) {
|
|
bool is_selected = (cur_sel_card_owner == n);
|
|
if (ImGui::Selectable(views_sel_card_owner[n].c_str(), is_selected)) {
|
|
cur_sel_card_owner = n;
|
|
}
|
|
if (is_selected) {
|
|
ImGui::SetItemDefaultFocus();
|
|
}
|
|
}
|
|
ImGui::EndCombo();
|
|
}
|
|
|
|
}
|
|
if (ImGui::Button(u8s("查询##serachex"))) {
|
|
}
|
|
if (ImGui::BeginTable(u8s("##keySerachTableEx"), 9, ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable))
|
|
{
|
|
ImGui::TableSetupColumn(u8s("卡密"), ImGuiTableColumnFlags_WidthFixed);
|
|
ImGui::TableSetupColumn(u8s("类型"), ImGuiTableColumnFlags_WidthFixed);
|
|
ImGui::TableSetupColumn(u8s("创建人"), ImGuiTableColumnFlags_WidthFixed);
|
|
ImGui::TableSetupColumn(u8s("创建时间"), ImGuiTableColumnFlags_WidthFixed);
|
|
ImGui::TableSetupColumn(u8s("启用时间"), ImGuiTableColumnFlags_WidthFixed);
|
|
ImGui::TableSetupColumn(u8s("到期时间"), ImGuiTableColumnFlags_WidthFixed);
|
|
ImGui::TableSetupColumn(u8s("备注"), ImGuiTableColumnFlags_WidthFixed);
|
|
ImGui::TableSetupColumn(u8s("复制"), ImGuiTableColumnFlags_WidthFixed);
|
|
ImGui::TableSetupColumn(u8s("复制一行"), ImGuiTableColumnFlags_WidthFixed);
|
|
ImGui::TableHeadersRow();
|
|
for (int i = 0; i < 100; i++)
|
|
{
|
|
ImGui::TableNextRow();
|
|
|
|
ImGui::TableSetColumnIndex(0);
|
|
ImGui::Text(u8s("卡密"));
|
|
|
|
ImGui::TableSetColumnIndex(1);
|
|
ImGui::Text(u8s("周卡"));
|
|
|
|
ImGui::TableSetColumnIndex(2);
|
|
ImGui::Text(u8s("测试"));
|
|
|
|
ImGui::TableSetColumnIndex(3);
|
|
ImGui::Text(u8s("2024-8-24 17:45:05"));
|
|
|
|
ImGui::TableSetColumnIndex(4);
|
|
ImGui::Text(u8s("2024-8-24 17:45:05"));
|
|
|
|
ImGui::TableSetColumnIndex(5);
|
|
ImGui::Text(u8s("2024-8-24 17:45:05"));
|
|
|
|
ImGui::TableSetColumnIndex(6);
|
|
ImGui::Text(u8s("测试"));
|
|
|
|
ImGui::TableSetColumnIndex(7);
|
|
if (ImGui::Button(StringHelper::Format(u8s("复制##ex_copy_%d"), i).c_str()))
|
|
{
|
|
MessageBoxA(NULL, std::to_string(i).c_str(), std::to_string(i).c_str(), MB_OK);
|
|
}
|
|
ImGui::TableSetColumnIndex(8);
|
|
if (ImGui::Button(StringHelper::Format(u8s("复制一行##ex_copy_line_%d"), i).c_str()))
|
|
{
|
|
MessageBoxA(NULL, std::to_string(i).c_str(), std::to_string(i).c_str(), MB_OK);
|
|
}
|
|
|
|
}
|
|
ImGui::EndTable();
|
|
}
|
|
|
|
}
|
|
void KeyTypesFrame(SIZE windowSize)
|
|
{
|
|
static bool _inAddCard = false;
|
|
static char newTypeName[0x100]{};
|
|
static char newTypepfx[0x100]{};
|
|
static int newTypeTime = 24;
|
|
if (_inAddCard)
|
|
{
|
|
ImGui::Text(u8s("名称:"));
|
|
_SL;
|
|
ImGui::SetNextItemWidth(100);
|
|
ImGui::InputText("##input_add_type_name", newTypeName, 0x100);
|
|
|
|
ImGui::Text(u8s("前缀:"));
|
|
_SL;
|
|
ImGui::SetNextItemWidth(100);
|
|
ImGui::InputText("##input_add_type_pfx", newTypepfx, 0x100);
|
|
|
|
ImGui::Text(u8s("时间:"));
|
|
_SL;
|
|
ImGui::SetNextItemWidth(100);
|
|
ImGui::InputInt("##input_add_type_time", &newTypeTime); _SL; ImGui::Text(u8s("小时"));
|
|
if (ImGui::Button(u8s("确定##create_type_ok")))
|
|
{
|
|
_inAddCard = false;
|
|
}
|
|
_SL;
|
|
if (ImGui::Button(u8s("取消##create_type_cancel")))
|
|
{
|
|
_inAddCard = false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (ImGui::Button(u8s("添加类型##create_type")))
|
|
{
|
|
ZeroMemory(newTypeName, 0x100);
|
|
ZeroMemory(newTypepfx, 0x100);
|
|
_inAddCard = true;
|
|
}
|
|
if (ImGui::BeginTable(u8s("##key_type_table"), 5, ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable))
|
|
{
|
|
ImGui::TableSetupColumn(u8s("名称"), ImGuiTableColumnFlags_WidthFixed);
|
|
ImGui::TableSetupColumn(u8s("前缀"), ImGuiTableColumnFlags_WidthFixed);
|
|
ImGui::TableSetupColumn(u8s("时长"), ImGuiTableColumnFlags_WidthFixed);
|
|
ImGui::TableSetupColumn(u8s(" "), ImGuiTableColumnFlags_WidthFixed);
|
|
ImGui::TableSetupColumn(u8s(" "), ImGuiTableColumnFlags_WidthFixed);
|
|
ImGui::TableHeadersRow();
|
|
for (int i = 0; i < 8; i++)
|
|
{
|
|
ImGui::TableNextRow();
|
|
|
|
ImGui::TableSetColumnIndex(0);
|
|
ImGui::Text(u8s("测试"));
|
|
|
|
ImGui::TableSetColumnIndex(1);
|
|
ImGui::Text(u8s("XX"));
|
|
|
|
ImGui::TableSetColumnIndex(2);
|
|
ImGui::Text(u8s("24"));
|
|
|
|
ImGui::TableSetColumnIndex(3);
|
|
if (ImGui::Button(StringHelper::Format(u8s("编辑##key_type_table_edit%d"), i).c_str()))
|
|
{
|
|
MessageBoxA(NULL, std::to_string(i).c_str(), std::to_string(i).c_str(), MB_OK);
|
|
}
|
|
ImGui::TableSetColumnIndex(4);
|
|
if (ImGui::Button(StringHelper::Format(u8s("删除##key_type_table_del%d"), i).c_str()))
|
|
{
|
|
MessageBoxA(NULL, std::to_string(i).c_str(), std::to_string(i).c_str(), MB_OK);
|
|
}
|
|
|
|
}
|
|
ImGui::EndTable();
|
|
}
|
|
}
|
|
|
|
}
|
|
void UserFrame(SIZE windowSize)
|
|
{
|
|
|
|
}
|
|
void CenterFrame(SIZE windowSize)
|
|
{
|
|
float headWidth = 150.0f;
|
|
ImGui::SetCursorPos(ImVec2(10, 10.0f));
|
|
ImGui::BeginChild(u8s("##TabHeads"), ImVec2(headWidth, windowSize.cy - 20), true, ImGuiWindowFlags_HorizontalScrollbar);
|
|
{
|
|
if (ImGui::Button(u8s("卡密查询##tab_head_keyserach"), ImVec2(CurrentTab == TabClass::KeySerach ? 130 : 120, 24)))
|
|
CurrentTab = TabClass::KeySerach;
|
|
|
|
if (ImGui::Button(u8s("卡密生成##tab_head_keycreate"), ImVec2(CurrentTab == TabClass::KeyCreater ? 130 : 120, 24)))
|
|
CurrentTab = TabClass::KeyCreater;
|
|
|
|
if (ImGui::Button(u8s("高级查询##tab_head_keyserachex"), ImVec2(CurrentTab == TabClass::KeySerachEx ? 130 : 120, 24)))
|
|
CurrentTab = TabClass::KeySerachEx;
|
|
|
|
if (ImGui::Button(u8s("卡密类型##tab_head_keytypes"), ImVec2(CurrentTab == TabClass::KeyTypes ? 130 : 120, 24)))
|
|
CurrentTab = TabClass::KeyTypes;
|
|
|
|
if (ImGui::Button(u8s("用户信息##tab_head_userinfo"), ImVec2(CurrentTab == TabClass::UserInfo ? 130 : 120, 24)))
|
|
CurrentTab = TabClass::UserInfo;
|
|
|
|
}
|
|
ImGui::EndChild();
|
|
ImGui::SetCursorPos(ImVec2(headWidth + 10, 10.0f));
|
|
ImGui::BeginChild(StringHelper::Format(u8s("##Frames_%d"), CurrentTab).c_str(), ImVec2(windowSize.cx - (headWidth + 25), windowSize.cy - 20), true, ImGuiWindowFlags_HorizontalScrollbar);
|
|
{
|
|
switch (CurrentTab)
|
|
{
|
|
case TabClass::KeySerach:
|
|
KeySerachFrame({ int(windowSize.cx - (headWidth + 28)),windowSize.cy - 15 });
|
|
break;
|
|
case TabClass::KeyCreater:
|
|
KeyCreateFrame({ int(windowSize.cx - (headWidth + 28)),windowSize.cy - 15 });
|
|
break;
|
|
case TabClass::KeySerachEx:
|
|
KeySerachFrameEx({ int(windowSize.cx - (headWidth + 28)),windowSize.cy - 15 });
|
|
break;
|
|
case TabClass::KeyTypes:
|
|
KeyTypesFrame({ int(windowSize.cx - (headWidth + 28)),windowSize.cy - 15 });
|
|
break;
|
|
case TabClass::UserInfo:
|
|
UserFrame({ int(windowSize.cx - (headWidth + 28)),windowSize.cy - 15 });
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
ImGui::EndChild();
|
|
}
|
|
void GuiRender(SIZE windowSize)
|
|
{
|
|
if (UserName.size() <= 0)
|
|
LoginFrame(windowSize);
|
|
else
|
|
CenterFrame(windowSize);
|
|
}
|
|
void RenderImGui() {
|
|
|
|
int width, height;
|
|
RECT rect;
|
|
GetClientRect(hwnd, &rect);
|
|
width = rect.right - rect.left;
|
|
height = rect.bottom - rect.top;
|
|
|
|
ImGui_ImplDX11_NewFrame();
|
|
ImGui_ImplWin32_NewFrame();
|
|
ImGui::NewFrame();
|
|
ImGui::SetNextWindowSize(ImVec2((float)width, (float)height));
|
|
ImGui::SetNextWindowPos(ImVec2(0, 0));
|
|
ImGui::Begin(u8s("##main_window"), nullptr,
|
|
ImGuiWindowFlags_NoTitleBar |
|
|
ImGuiWindowFlags_NoResize |
|
|
ImGuiWindowFlags_NoMove |
|
|
ImGuiWindowFlags_NoScrollbar |
|
|
ImGuiWindowFlags_NoScrollWithMouse);
|
|
{
|
|
GuiRender({ width, height });
|
|
}
|
|
ImGui::End();
|
|
ImGui::EndFrame();
|
|
ImGui::Render();
|
|
ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());
|
|
}
|
|
void CreateRenderTarget() {
|
|
ID3D11Texture2D* pBackBuffer = nullptr;
|
|
g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer));
|
|
|
|
D3D11_RENDER_TARGET_VIEW_DESC desc;
|
|
ZeroMemory(&desc, sizeof(desc));
|
|
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
|
desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
|
|
|
|
g_pd3dDevice->CreateRenderTargetView(pBackBuffer, &desc, &g_pRenderTargetView);
|
|
pBackBuffer->Release();
|
|
}
|
|
void Render() {
|
|
g_pImmediateContext->OMSetRenderTargets(1, &g_pRenderTargetView, NULL);
|
|
float black[] = { 0.0f, 0.0f, 0.0f, 0.0f };
|
|
g_pImmediateContext->ClearRenderTargetView(g_pRenderTargetView, black);
|
|
RenderImGui();
|
|
g_pSwapChain->Present(0, 0);
|
|
}
|
|
extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
|
|
|
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
ImGui_ImplWin32_WndProcHandler(hWnd, message, wParam, lParam);
|
|
switch (message) {
|
|
case WM_DESTROY:
|
|
exit(0);
|
|
break;
|
|
case WM_SIZE:
|
|
if (g_pSwapChain)
|
|
{
|
|
ImGui::GetIO().DisplaySize = ImVec2((float)LOWORD(lParam), (float)HIWORD(lParam));
|
|
if (g_pRenderTargetView) {
|
|
g_pRenderTargetView->Release();
|
|
g_pRenderTargetView = nullptr;
|
|
}
|
|
ID3D11Texture2D* pBackBuffer = nullptr;
|
|
HRESULT hr = g_pSwapChain->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, 0);
|
|
if (SUCCEEDED(hr)) {
|
|
hr = g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer));
|
|
if (SUCCEEDED(hr)) {
|
|
g_pd3dDevice->CreateRenderTargetView(pBackBuffer, nullptr, &g_pRenderTargetView);
|
|
pBackBuffer->Release();
|
|
}
|
|
}
|
|
Render();
|
|
}
|
|
break;
|
|
case WM_MOVE:
|
|
if (g_pSwapChain)
|
|
{
|
|
Render();
|
|
}
|
|
break;
|
|
default:
|
|
return DefWindowProc(hWnd, message, wParam, lParam);
|
|
}
|
|
return 0;
|
|
}
|
|
void embraceTheDarkness()
|
|
{
|
|
ImGuiStyle& style = ImGui::GetStyle();
|
|
style.Alpha = 1.0;
|
|
//style.WindowFillAlphaDefault = 0.83;
|
|
//style.ChildWindowRounding = 3;
|
|
style.WindowRounding = 3;
|
|
style.GrabRounding = 1;
|
|
style.GrabMinSize = 20;
|
|
style.FrameRounding = 3;
|
|
|
|
|
|
style.Colors[ImGuiCol_Text] = ImVec4(0.00f, 1.00f, 1.00f, 1.00f);
|
|
style.Colors[ImGuiCol_TextDisabled] = ImVec4(0.00f, 0.40f, 0.41f, 1.00f);
|
|
style.Colors[ImGuiCol_WindowBg] = ImVec4(0.00f, 0.00f, 0.00f, 1.00f);
|
|
//style.Colors[ImGuiCol_ChildWindowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);
|
|
style.Colors[ImGuiCol_Border] = ImVec4(0.00f, 1.00f, 1.00f, 0.65f);
|
|
style.Colors[ImGuiCol_BorderShadow] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);
|
|
style.Colors[ImGuiCol_FrameBg] = ImVec4(0.44f, 0.80f, 0.80f, 0.18f);
|
|
style.Colors[ImGuiCol_FrameBgHovered] = ImVec4(0.44f, 0.80f, 0.80f, 0.27f);
|
|
style.Colors[ImGuiCol_FrameBgActive] = ImVec4(0.44f, 0.81f, 0.86f, 0.66f);
|
|
style.Colors[ImGuiCol_TitleBg] = ImVec4(0.14f, 0.18f, 0.21f, 0.73f);
|
|
style.Colors[ImGuiCol_TitleBgCollapsed] = ImVec4(0.00f, 0.00f, 0.00f, 0.54f);
|
|
style.Colors[ImGuiCol_TitleBgActive] = ImVec4(0.00f, 1.00f, 1.00f, 0.27f);
|
|
style.Colors[ImGuiCol_MenuBarBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.20f);
|
|
style.Colors[ImGuiCol_ScrollbarBg] = ImVec4(0.22f, 0.29f, 0.30f, 0.71f);
|
|
style.Colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.00f, 1.00f, 1.00f, 0.44f);
|
|
style.Colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.00f, 1.00f, 1.00f, 0.74f);
|
|
style.Colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.00f, 1.00f, 1.00f, 1.00f);
|
|
//style.Colors[ImGuiCol_ComboBg] = ImVec4(0.16f, 0.24f, 0.22f, 0.60f);
|
|
style.Colors[ImGuiCol_CheckMark] = ImVec4(0.00f, 1.00f, 1.00f, 0.68f);
|
|
style.Colors[ImGuiCol_SliderGrab] = ImVec4(0.00f, 1.00f, 1.00f, 0.36f);
|
|
style.Colors[ImGuiCol_SliderGrabActive] = ImVec4(0.00f, 1.00f, 1.00f, 0.76f);
|
|
style.Colors[ImGuiCol_Button] = ImVec4(0.00f, 0.65f, 0.65f, 0.46f);
|
|
style.Colors[ImGuiCol_ButtonHovered] = ImVec4(0.01f, 1.00f, 1.00f, 0.43f);
|
|
style.Colors[ImGuiCol_ButtonActive] = ImVec4(0.00f, 1.00f, 1.00f, 0.62f);
|
|
style.Colors[ImGuiCol_Header] = ImVec4(0.00f, 1.00f, 1.00f, 0.33f);
|
|
style.Colors[ImGuiCol_HeaderHovered] = ImVec4(0.00f, 1.00f, 1.00f, 0.42f);
|
|
style.Colors[ImGuiCol_HeaderActive] = ImVec4(0.00f, 1.00f, 1.00f, 0.54f);
|
|
//style.Colors[ImGuiCol_Column] = ImVec4(0.00f, 0.50f, 0.50f, 0.33f);
|
|
//style.Colors[ImGuiCol_ColumnHovered] = ImVec4(0.00f, 0.50f, 0.50f, 0.47f);
|
|
//style.Colors[ImGuiCol_ColumnActive] = ImVec4(0.00f, 0.70f, 0.70f, 1.00f);
|
|
style.Colors[ImGuiCol_ResizeGrip] = ImVec4(0.00f, 1.00f, 1.00f, 0.54f);
|
|
style.Colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.00f, 1.00f, 1.00f, 0.74f);
|
|
style.Colors[ImGuiCol_ResizeGripActive] = ImVec4(0.00f, 1.00f, 1.00f, 1.00f);
|
|
//style.Colors[ImGuiCol_CloseButton] = ImVec4(0.00f, 0.78f, 0.78f, 0.35f);
|
|
//style.Colors[ImGuiCol_CloseButtonHovered] = ImVec4(0.00f, 0.78f, 0.78f, 0.47f);
|
|
//style.Colors[ImGuiCol_CloseButtonActive] = ImVec4(0.00f, 0.78f, 0.78f, 1.00f);
|
|
style.Colors[ImGuiCol_PlotLines] = ImVec4(0.00f, 1.00f, 1.00f, 1.00f);
|
|
style.Colors[ImGuiCol_PlotLinesHovered] = ImVec4(0.00f, 1.00f, 1.00f, 1.00f);
|
|
style.Colors[ImGuiCol_PlotHistogram] = ImVec4(0.00f, 1.00f, 1.00f, 1.00f);
|
|
style.Colors[ImGuiCol_PlotHistogramHovered] = ImVec4(0.00f, 1.00f, 1.00f, 1.00f);
|
|
style.Colors[ImGuiCol_TextSelectedBg] = ImVec4(0.00f, 1.00f, 1.00f, 0.22f);
|
|
//style.Colors[ImGuiCol_TooltipBg] = ImVec4(0.00f, 0.13f, 0.13f, 0.90f);
|
|
//style.Colors[ImGuiCol_ModalWindowDarkening] = ImVec4(0.04f, 0.10f, 0.09f, 0.51f);
|
|
}
|
|
#include "EncryptedPak.h"
|
|
struct TestSubStruct
|
|
{
|
|
const char name[0x10];
|
|
double v;
|
|
ULONG64 h;
|
|
};
|
|
struct TestStruct
|
|
{
|
|
const char name[0x10];
|
|
double v;
|
|
int h;
|
|
TestSubStruct sub_;
|
|
};
|
|
|
|
int main()
|
|
{
|
|
WNDCLASSEX wc = {};
|
|
wc.cbSize = sizeof(WNDCLASSEX);
|
|
wc.style = CS_HREDRAW | CS_VREDRAW;
|
|
wc.lpfnWndProc = WindowProc;
|
|
wc.hInstance = GetModuleHandleA(NULL);
|
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
|
|
wc.lpszClassName = L"KNWindowClass";
|
|
RegisterClassEx(&wc);
|
|
int width = 1600;
|
|
int height = 960;
|
|
hwnd = CreateWindow(L"KNWindowClass", L"KNClient", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, width, height, NULL, NULL, GetModuleHandleA(NULL), NULL);
|
|
|
|
ShowWindow(hwnd, true);
|
|
InitD3D(hwnd);
|
|
CreateRenderTarget();
|
|
|
|
duplicator = new DXGIDuplicator();
|
|
if (!duplicator->InitD3D11Device(g_pd3dDevice, g_pImmediateContext))
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if (!duplicator->InitDuplication())
|
|
{
|
|
return 2;
|
|
}
|
|
|
|
InitImGui();
|
|
embraceTheDarkness();
|
|
|
|
MSG msg = {};
|
|
bool running = true;
|
|
while (running) {
|
|
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
|
|
{
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
if (msg.message == WM_QUIT)
|
|
running = false;
|
|
else
|
|
{
|
|
Render();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
static LONGLONG lastRender = 0;
|
|
LONGLONG now = GetTickCount64();
|
|
if (now - lastRender > 10)
|
|
{
|
|
lastRender = now;
|
|
Render();
|
|
}
|
|
Sleep(1);
|
|
}
|
|
}
|
|
g_pRenderTargetView->Release();
|
|
g_pSwapChain->Release();
|
|
g_pImmediateContext->Release();
|
|
g_pd3dDevice->Release();
|
|
return NULL;
|
|
} |