现在有两个程序,暂且分别称做:主程序,和向导程序我现在在一个程序中点击按钮, 打开一个向导程序,在向导程序的App文件中 我添加如下代码:
/** 不显示原始对话框*/
// CFileCreatorDlg dlg;
//  int nResponse = dlg.DoModal();
所以程序一启动就进入了向导的第一个page而且我想点击主程序按钮的时候,只产生一个向导程序, 如果当前已经有一个向导程序再运行,则使他保持在最前端 g_mutex = CreateMutex(NULL, TRUE, "FileCreator");
DWORD dwLastError = GetLastError();
if(g_mutex && dwLastError == ERROR_ALREADY_EXISTS)
{
HWND hWnd = FindWindow(NULL, "设置数据库-step1");
if(hWnd)
{
SetForegroundWindow(hWnd);
}
return FALSE;
}
其中“设置数据库-step1” 是我向导的第一个page的标题问题就在SetForegroundWindow(hWnd);他需要的参数是要被前端显示的窗口句柄,
所以, HWND hWnd = FindWindow(NULL, "设置数据库-step1");所以这个函数就不行了, 我总不能一个page一个page的找吧请问有什么好的方法??

解决方案 »

  1.   

    一个page一个page找什么?没看懂
      

  2.   

    问题解决了,我在向导程序的 onInitDialog函数中 创建共享内存   if(g_hFileMapping)
        {
            // 将共享内存映射到当前进程
            LPVOID pAddr = MapViewOfFile(g_hFileMapping, FILE_MAP_WRITE, 0, 0, sizeof(HWND));
            if(pAddr)
            {
                // 将当前主窗口句柄写入共享内存
                *(HWND*)pAddr = this->m_hWnd;
                // 撤销内存映射
                UnmapViewOfFile(pAddr);
            }        
        }
    g_hFileMapping是定义在App文件的全局变量。
    然后在,App文件的InitInstance函数中
        // 创建共享内存
        g_hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(HWND), 
            "FileCreator{60869E30-4223-4e45-90CD-2F7FF0EDFBD8}");
     
        // 实例已经存在
        if(g_hFileMapping != NULL && GetLastError() == ERROR_ALREADY_EXISTS)
        {
            // 将共享内存映射到当前进程
            LPVOID pAddr = MapViewOfFile(g_hFileMapping, FILE_MAP_READ, 0, 0, sizeof(HWND));
            if(pAddr)
            {
                // 读取共享内存中的窗口句柄
                HWND hWnd = *(HWND*)pAddr;
                if(hWnd && IsWindow(hWnd))
                {
                    // 将已经存在的窗口实例放置到前台
                    SetForegroundWindow(hWnd);
                }
                // 释放共享内存映射
                UnmapViewOfFile(pAddr);
            }

            return FALSE;
        }