我是想用FindWindow来查找一个窗口
比如程序A
HWND hWnd=::FindWindow(NULL,"AA");
if(hWnd!=NULL)
{
  ::PostMessage(hWnd,MYWM_NOTIFYICON,0,WM_LBUTTONDOWN);
  PostQuitMessage(0);
}
目的是查看当前是否有程序A的实例在运行,如果有,则让其显示,因为程序可能是托盘状态(隐藏)
FindWindow找到的是当前运行的程序自身,怎么样找到下一个标题为AA的程序。

解决方案 »

  1.   

    可以用 CreateMutex 函数来间接达到目的
      

  2.   

    你这个方法不是很好。我在一个程序中也需要这一功能,当时从网上找了一个。把下面的代码放在应用程序类InitInstance函数里面作为首先执行的代码就可以了。如果有问题再调一调应该就可以了。// 用应用程序名创建信号量
    HANDLE hSem = CreateSemaphore(NULL, 1, 1, m_pszExeName);

    // 信号量已存在?
    // 信号量存在,则程序已有一个实例运行
    if (GetLastError() == ERROR_ALREADY_EXISTS)
    {
    // 关闭信号量句柄
    CloseHandle(hSem);

    // 寻找先前实例的主窗口
    HWND hWndPrevious = ::GetWindow(::GetDesktopWindow(), GW_CHILD);
    while (::IsWindow(hWndPrevious))
    {
    // 检查窗口是否有预设的标记?
    // 有,则是我们寻找的主窗
    if (::GetProp(hWndPrevious, m_pszExeName))
    {
    // 主窗口已最小化,则恢复其大小
    if (::IsIconic(hWndPrevious))
    ::ShowWindow(hWndPrevious, 
    SW_RESTORE);
    // 将主窗激活
    ::SetForegroundWindow(hWndPrevious);
    // 将主窗的对话框激活
    ::SetForegroundWindow(
    ::GetLastActivePopup(hWndPrevious));

    // 退出本实例
    return FALSE;
    }

    // 继续寻找下一个窗口
    hWndPrevious = ::GetWindow(hWndPrevious, 
    GW_HWNDNEXT);
    }

    // 前一实例已存在,但找不到其主窗
    // 可能出错了
    // 退出本实例
    return FALSE;
    } // 用应用程序名创建信号量
    hSem = CreateSemaphore(NULL, 1, 1, _T("ncMain"));

    // 信号量已存在?
    // 信号量存在,则程序已有一个实例运行
    if (GetLastError() == ERROR_ALREADY_EXISTS)
    {
    // 关闭信号量句柄
    CloseHandle(hSem);

    // 寻找先前实例的主窗口
    HWND hWndPrevious = ::GetWindow(::GetDesktopWindow(), GW_CHILD);
    while (::IsWindow(hWndPrevious))
    {
    // 检查窗口是否有预设的标记?
    // 有,则是我们寻找的主窗
    if (::GetProp(hWndPrevious, _T("ncMain")))
    {
    // 主窗口已最小化,则恢复其大小
    if (::IsIconic(hWndPrevious))
    ::ShowWindow(hWndPrevious, 
    SW_RESTORE);
    // 将主窗激活
    ::SetForegroundWindow(hWndPrevious);
    // 将主窗的对话框激活
    ::SetForegroundWindow(
    ::GetLastActivePopup(hWndPrevious));

    // 退出本实例
    return FALSE;
    }

    // 继续寻找下一个窗口
    hWndPrevious = ::GetWindow(hWndPrevious, 
    GW_HWNDNEXT);
    }

    // 前一实例已存在,但找不到其主窗
    // 可能出错了
    // 退出本实例
    return FALSE;
    }
    else
    {
    CloseHandle(hSem);
    }
      

  3.   

    HWND hWnd=::FindWindow(NULL,"AA");想找哪个程序的,就把AA换成他的标题就行了.
    hCurWindow= FindWindow(NULL,"QQ用户登录")
    这样就可以找到QQ了..
      

  4.   

    可以用 CreateMutex 函数来间接达到目的因为那个程序可能显示为托盘图标,并且其ShowWindow(SW_HIDE)隐藏了,要把它显示出来,简单的CreateMutex是不行的。我还要让前一实列显示出来。spanzhang(红尘斩丝客) 
    的方法不错,可能是因为我使用了ShowWindow(SW_HIDE)的原因吧,结果总是找到那个窗口,还是谢谢。gofqjyie(誓将天下了然于胸) 
    没太明白我的意思。
      

  5.   

    后决定使用EnumWindowsHWND m_hWnd=AfxGetMainWnd()->m_hWnd;
    TCHAR title[MAX_PATH+2];
    ::GetWindowText(hwnd,title,sizeof(title));
    if(strcmp(title,"AA")==0)
    {
    if(m_hWnd==hwnd)
    {//在这里本来是要判断是否是当前应用程序的窗口,如果是则继续
                         //但在没前另一个实例在运行的情况下当前程序退出了,如果有也是当
                         //退出了,且前一实例没有显示出来
    return TRUE;
    }
    ::PostMessage(hwnd,MYWM_NOTIFYICON,0,WM_LBUTTONDOWN);
    PostQuitMessage(0);
    return FALSE;
    }
    return TRUE;