C++ GUI 应用程序 : Starting a child process in WndProc ( no MFC )

标签 c++ winapi user-interface process

我一直无法在我的 GUI 应用程序中启动子进程。下面是我的 WndProc。我希望 ID_TOOLS_NEWPROCESS 案例启动一个将打开对话框的新进程。这会允许主窗口在新窗口打开时保持响应吗?

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;

switch (message)
{
case WM_COMMAND:
    wmId    = LOWORD(wParam);
    wmEvent = HIWORD(wParam);
    // Parse the menu selections:
    switch (wmId)
    {
    case IDM_ABOUT:
        DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
        break;
    case IDM_EXIT:
        DestroyWindow(hWnd);
        break;
    case ID_TOOLS_NEWPROCESS:
        DialogBox(hInst, MAKEINTRESOURCE(IDD_NEWBOX), hWnd, NEW);
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    break;
case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    // Draw text in the main window
    TextOut(hdc, 10, 10, L"Main Window",11);
    EndPaint(hWnd, &ps);
    break;
case WM_DESTROY:
    PostQuitMessage(0);
    break;
default:
    return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

我希望我已经解释清楚了,非常感谢对此问题的任何帮助。

  • 丹。

编辑: @罗杰·斯图尔特

about 使用以下内容作为其消息泵:

INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam,         LPARAM lParam)
{

UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
    return (INT_PTR)TRUE;

case WM_COMMAND:
    if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDOK)
    {
        EndDialog(hDlg, LOWORD(wParam));
        return (INT_PTR)TRUE;
    }
    break;
}
return (INT_PTR)FALSE;
}

这里的问题是,当关于框打开时,后面的主窗口没有响应,直到关闭关于框。我希望能够在主窗口仍然响应的情况下打开和控制多个对话框。

编辑 2: 这是我现在拥有的代码,但我仍然无法选择打开“关于”框的主窗口。

关于框的消息处理程序:

INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{

UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
    return (INT_PTR)TRUE;

case WM_ACTIVATE:
    if (0 == wParam)             // becoming inactive
        hDlgCurrent = NULL;
    else                         // becoming active
        hDlgCurrent = hDlg;
    return FALSE;

case WM_COMMAND:
    if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDOK)
    {
        EndDialog(hDlg, LOWORD(wParam));
        return (INT_PTR)TRUE;
    }
    break;
}
return (INT_PTR)FALSE;
}

主消息循环:

     while (GetMessage(&msg, NULL, 0, 0))
     {
     if (NULL == hDlgCurrent || !IsDialogMessage(hDlgCurrent, &msg))
        {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
        }
     }

@David - 你能否解释一下为什么这仍然没有返回预期的结果。

最佳答案

谢谢@David。解决方案确实是使用 CreateDialog() 而不是 DialogBox()

我的程序现在也能正常运行了。

-丹。

关于C++ GUI 应用程序 : Starting a child process in WndProc ( no MFC ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10247470/

相关文章:

c++ - 从类实例和主实例运行线程

windows - 确定 Windows 进程是否有权创建符号链接(symbolic link)

c++ - 调用 Windows API 内联汇编的问题

java - UI Windows 8 Look in JAVA

c++ - C++ 中 strcpy_s 的复杂性

c++ - 对齐堆栈上的数据 (C++)

C++空间问题

c++ - 有什么方法可以将 3rd 方 DLL 中的静态变量重置为其原始值吗?

git - 为 Ubuntu 11.10 推荐一个 Git GUI 客户端

python - 在 python GUI 中使用坐标列表创建一条线