dllをゲームプロセスに挿入し、dllで作成するフックを作成して、Windowsイベントを処理する新しいスレッドを作成します。WinAPIでDLLを作成する
スレッド関数:
void CFile::winThread(void *pData)
{
CFile *pThis = reinterpret_cast<CFile*>(pData);
// Common controls init
INITCOMMONCONTROLSEX iCC;
iCC.dwSize = sizeof(INITCOMMONCONTROLSEX);
iCC.dwICC = ICC_BAR_CLASSES;
InitCommonControlsEx(&iCC);
pThis->m_pConnect = new WinConnect(300, 180);
pThis->m_pConnect->setText("Connecting");
pThis->m_pConnect->show();
MSG message;
while (GetMessage(&message, 0, 0, 0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
tthread::mutex _mutex;
_mutex.lock();
pThis->m_bIsFinished = true;
_mutex.unlock();
}
WinConnect.cpp
WinConnect::WinConnect(int width, int height)
{
if (registerWin())
{
int screenWidth = GetSystemMetrics(SM_CXSCREEN);
int screenHeight = GetSystemMetrics(SM_CYSCREEN);
int x = (screenWidth/2) - (width/2);
int y = (screenHeight/2) - (height/2);
m_hWin = CreateWindowExA(WS_EX_CLIENTEDGE, winNameConnect, "Test Window",
WS_POPUP | WS_BORDER | WS_CAPTION,
x, y + 200, width, height, NULL, NULL, GetModuleHandle(NULL), NULL);
printf("GetLastError %d\n", GetLastError());
if (m_hWin)
{
RECT size;
GetClientRect(m_hWin, &size);
int winH = size.bottom - size.top;
int winW = size.right - size.left;
int buttonW = winW/2;
m_hLInfo = CreateWindowEx(0, "STATIC", "",
WS_VISIBLE | WS_CHILD | SS_CENTER | SS_CENTERIMAGE,
7, 7, winW - 14, winH - 41, m_hWin, NULL, GetModuleHandle(NULL), NULL);
printf("GetLastError %d\n", GetLastError());
// 9 pix odstep height
m_hBCancel = CreateWindowEx(0, "BUTTON", "Cancel",
WS_VISIBLE | WS_CHILD | SS_CENTER,
buttonW/2, winH - 30, buttonW, 25, m_hWin, NULL, GetModuleHandle(NULL), NULL);
printf("GetLastError %d\n", GetLastError());
}
}
}
bool WinConnect::registerWin()
{
WNDCLASSEX winClass;
winClass.hInstance = GetModuleHandle(NULL);
winClass.lpszClassName = winNameConnect;
winClass.lpfnWndProc = wndProc;
winClass.style = CS_DBLCLKS;
winClass.cbSize = sizeof(WNDCLASSEX);
winClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
winClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
winClass.hCursor = LoadCursor(NULL, IDC_ARROW);
winClass.lpszMenuName = NULL;
winClass.cbClsExtra = 0;
winClass.cbWndExtra = 0;
winClass.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
if (!RegisterClassEx(&winClass))
return false;
return true;
}
のGetLastErrorの出力は、次のとおり
のGetLastError 0
のGetLastError 127
のGetLastError 127
このラベルとボタンが作成されていない理由を私は理解することはできません。常にウィンドウが作成され、問題が発生します。どんな助け?
壊れたエラー処理がありますwinapi関数が失敗したときに初めてGetLastError()を呼び出すだけです。 –
'GetLastError'は最後のエラーを返します。有用な値を返すために 'GetLastError'が実際にはエラーがあります。特定の関数がエラーをどのように示しているかは、関数によって異なります。 – Neil
だから、どのようなアイデア、どのように私は本当の理由を確認できますか? –