我使用了BringWindowToTop函数设定窗口(设定的窗口是自己本身)为活动窗口。
但是生成EXE(包括DEBUG/RELEASE两个版本)文件后对cmd窗口(c:\windows\system32\cmd.exe)失效,现象是cmd窗口闪几下,未到最前面。奇怪有两点:其它窗口无此现象,在任何情况下都是好用的。在工程中执行无此现象,cmd窗能到最前面。望高手指点。

解决方案 »

  1.   

    你怎么做的?对比一下下面的代码。
    HWND h = ::FindWindow(NULL, "C:\\WINDOWS\\system32\\cmd.exe");
    BOOL b = ::BringWindowToTop(h);
      

  2.   

    我是想把自己的窗口放到CMD窗口的前面.我大致做法是:
    自己窗口上按下一个按钮,启动计时器,设定10秒后执行BringWindowToTop代码.
    在这期间手动把CMD放到我窗口上.
    10秒后执行到OnTimer()函数,在OnTimer()中执行BringWindowToTop函数,把我自己窗口放到CMD窗口前.这时我自己窗口不能到CMD窗口前面.
      

  3.   

    如果当前的前台窗口不属于你的进程,BringWindowToTop这类的函数都会失败,因为这种操作是Windows不允许的。
      

  4.   

    是有这个限制。
    但是用AttachThreadInput API函数其它窗口都实现了,只有CMD窗口不好使。在VISTA下也有这个问题,我怀疑CMD窗口内部实现有些特殊。
    在XP下CMD窗口外观与其它窗口风格不一致,但在VISTA下风格统一了。遇到这样的问题实在是不好办,希望高手帮忙。
      

  5.   

    代码贴出来:
        //取得当前的顶层窗口,共享同一个虚拟输入队列
        AttachThreadInput(
            GetWindowThreadProcessId(
            ::GetForegroundWindow(), 0),
            GetCurrentThreadId(), TRUE);    bSetForeOK = SetForegroundWindow();    //取得当前的顶层窗口,释放共享的虚拟输入队列
        AttachThreadInput(
            GetWindowThreadProcessId(
            ::GetForegroundWindow(), 0),
            GetCurrentThreadId(), FALSE);
      

  6.   

    AttachThreadInput要求两个线程都有消息队列,否则会失败。cmd.exe应该是没有消息队列的,你调试看一下AttachThreadInput是不是返回失败了。
      

  7.   

    AttachThreadInput有时返回假,返回假时没什么规律.更怪的事情发生了,今天的程序好使了,我的程序能到CMD前面了,重启之后也好使.
    昨天还不行呢,但今天用其他人的机器还是不行.cnzdgs谢谢你的帮忙.
    在Windows核心编程这本书里,有个例子程序,功能和我要的一样.
    位置是:第27章 硬件输入模型和局部输入状态
    随书的code名称是:LISLabCSDN的下载里有这本书.
    http://download.csdn.net/source/226707
    帮看看.
      

  8.   

    你在程序里面判断AttachThreadInput的返回值,失败时用GetLastError获取错误码,显示出来看看是什么原因。
      

  9.   

    AttachThreadInput返回FALSE时,GetLastError返回0.