我在Win32 GUI编程中只用了一周时间,所以我很自信/希望这很简单。为了您的考虑,我在下面提供了我的代码示例。
作为一个简短的简介,我的应用程序会监视另一个应用程序是否打开,以便我可以修改该应用程序的内存。我已将此初始检查放在我的UI looper顶部,如下所示,它只会运行一次(在这种情况下,用户只能取消并关闭应用程序,或者执行恢复超过if
语句hWndApp指定了值):
if (!hWndApp) {
appCheck();
}
如果我启动我的应用程序并且其他应用程序没有运行,则appCheck();
会触发,并且执行的瀑布会相应地起作用:出现一个消息框(如果用户点击&#34,它将一直显示;重试")直到找到其他应用程序的窗口。如果用户点击"取消,"应用程序退出,一切都很好。如果他们点击"重试"一旦另一个应用程序运行,那么我的应用程序将完成绘画到屏幕并执行是正常的。
有趣的商家会在下次调用appCheck();
时启动(当点击其中一个按钮时会发生这种情况)如果其他应用程序已打开,则关闭。
在调试时(通过Visual Studio 2017),变量I将MessageBox()
调用分配给其他应用程序打开时等于0,然后关闭,然后执行以下操作:
appCheck();
getProcessHandleAndPID();
语句中调用if
,因为无法找到该窗口AppCheckMessageBox();
循环中调用while
,因为无法找到该窗口AppCheckMessageBox();
内的第一行,这是整个int msgboxID = MessageBox();
位default
的值为0(表示msgboxID
,因此在触发switch语句中的MessageBox()
选项后,没有显示窗口且应用程序存在呼叫失败,所以我尝试在GetLastError()
之前调用exit(EXIT_FAILURE)
,但无济于事。)我不确定我的错误在哪里,但我已经找到了许多解决方案 - 其中没有一个已经淘汰了。最后,如果你看到下面看起来错误或未声明的任何变量,那完全是由于我修改了这篇文章的代码以试图概括/缩短它。我可能遗漏了一些全局变量声明等等。
感谢您提供的任何帮助/指导!我现在已经结束了这件事......哈哈。
//--------------------------------------------------
// Function to get process handle and PID of app /
//------------------------------------------------
void getProcessHandleAndPID()
{
hWndApp = FindWindow(NULL, _T("NameOfApplication"));
while (!hWndApp) {
AppCheckMessageBox();
}
//Much more code here
}
//---------------------------------
// Function to show message box /
//-------------------------------
int AppCheckMessageBox()
{
int msgboxID = MessageBox(
NULL, //I tried making this hWndApp as well, but no difference
(LPCWSTR)L"Cancel to exit or start the app and click Retry.",
(LPCWSTR)L"Application Not Found!",
MB_ICONSTOP | MB_RETRYCANCEL | MB_SYSTEMMODAL | MB_SETFOREGROUND
);
switch (msgboxID)
{
case IDCANCEL:
exit(EXIT_FAILURE);
case IDRETRY:
getProcessHandleAndPID();
break;
default:
//GetLastError();
exit(EXIT_FAILURE);
}
return msgboxID;
}
//------------------------------------------------
// Function to check if application is running /
//----------------------------------------------
void appCheck() {
if (!FindWindow(NULL, _T("NameOfApplication"))) {
getProcessHandleAndPID();
}
}
//--------------------------------------------------
// Function to get process handle and PID of app /
//------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if (!hWndApp) {
appCheck();
}
switch (message)
{
case WM_PAINT:
//Code here
break;
case WM_CREATE:
//Code here
break;
case WM_COMMAND:
switch (HIWORD(wParam))
{
case BN_CLICKED:
if (LOWORD(wParam) == BTN_ENABLE) {
appCheck();
//Do stuff with button press
}
if (LOWORD(wParam) == BTN_DISABLE) {
appCheck();
//Do stuff with button press
}
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
break;
}
return 0;
}
答案 0 :(得分:0)
不是答案,但评论时间太长了:
appCheck()
是错误的做法。如果您想在窗口打开后调用一次,请在进入消息循环之前执行此操作。getProcessHandleAndPID()
调用AppCheckMessageBox()
,调用getProcessHandleAndPID()
调用...)并可能导致堆栈溢出。