有一个第三方程序,是.net开发的,已经知道主窗口句柄Hwnd。
那个程序如果手工正常点那个[X]关闭或者点退出按钮,或者点标题栏菜单的关闭,都会弹出一个提示“程序关闭”
但不知道为什么只要一执行
ShowWindow(Hwnd,SW_HIDE);
程序就直接退出了?连那个“程序关闭”的提示都不会出现。而且进程列表里也确实不没有这个程序的进程了。开发那个第三方程序的人让我看了他的代码,确实没有什么特别的地方。请大家帮我分析一下,什么原因可能导致ShowWindow(Hwnd,SW_HIDE);程序退出呢?
我只是想把那个窗体给隐藏起来而已。

解决方案 »

  1.   

    .net的可能和delphi有冲突?打架?
    开个玩笑,比较同意消息异常,用.net的开发工具写这个没问题吧?
      

  2.   

    你截获那个消息啊,弹出东西来,看能响应不,不能响应而退出,则肯定是那个程序的问题,或者.net有什么规则.
      

  3.   

    .net中HIDE后不再任务栏显示(不是关闭了),是不是程序关闭了呢?
    放个timer在一定时间后this.Show();后看看就知道了
      

  4.   


    隐藏之前进程里能看到对应进程,ShowWindow(Hwnd,SW_HIDE);之后连进程都看不到了。
    ShowWindow(Hwnd,SW_HIDE);好像不至于隐藏进程吧?
      

  5.   

    会不会。NET程序重写了DefWndProc方法
      

  6.   

    你现在是不是想做到隐藏窗体,但程序不关?如果仅是这样的话,并不一定非要用ShowWindow函数。还有其它更高明的方法。不知道我说出来后能得到多少分。
      

  7.   

    請確認一點:你的應用程序的mainForm是否為你所要ShowWindow(Hwnd,SW_HIDE)的窗體?如果是,請參考application.run裏面的代碼,就可以發現爲什麽會關閉整個應用程序的原因了。p.s. 自己看看源代碼比較好 good luck
      

  8.   

    你先试试这个:ShowWindowASync(被控窗体句柄,SW_HIDE);
      

  9.   

    楼上的打错了, SetWindowLeng根本不存在,除非你自己定义,正确的是 SetWindowLong,但还有其它方法,而且很多。
      

  10.   

    ShowWindowASync虽然确实能隐藏窗口,但跟showwindow效果差不太多。而且也都会闪一下才隐藏。
    怎样才能让那个窗口看起来好像压根儿就没出现过呢?
      

  11.   

    你的问题最初是ShowWindows执行后程序退出的问题,我随便换一种办法就把你的解决了。现在你却用“虽然……但……而且”来拖延结贴时间。我就知道,解决了你的问题也不会立即解贴给分。我在11楼描述你问题的时候,你在13楼并没有提出异议,我11楼中所言中有一个“仅”字,意思就是除此之外其它问题就不再属于此问题之内,因此,你提新问题请再开新贴。等会看你给我多少分了,如果分太少,下次你……
      

  12.   

    to mwy654321:
    我只能告诉你,虽然用了ShowWindowASync,但那个程序该退出还是退出。根本没解决问题。
    另外,以后我发的帖子你最好都不要再做任何回答。相信CSDN上少你一个,并不会有什么变化。
    我以前发的帖子,你也从来都是只知道要分,难道这分对你就那么重要?能换成RMB?
      

  13.   

    感谢 Avan_Lau  提醒了我,去认真阅读那个程序的启动部分的代码,虽然不是Application.run,因为它是.net开发的。
    之所以那个程序我hide的时候,程序进程会退出,好像是因为
    它是弹出的对话框窗口,虽然表面看起来是一个普通窗口。
    弹出后面跟了一句:Application.exit            frmPre.ShowDialog()
                Application.Exit()然后在frmPre的后续操作中,又打开了一个frmMain。其实上,它是两个程序,A程序先打开B程序,然后关闭自己。
    但表面看起来是一个程序。原因找到了,所以我对这个窗口就不能Hide了。
    剩下的问题就是我不太理解,为什么这个窗口hide会导致Application.Exit()代码被执行。
    但这个可能就属于.net代码执行机制的问题了。感兴趣的可以回答下。
      

  14.   

    如果用ShowWindowASync没解决的话,可以用 SetWindowPos(句柄,HWND_TOPMOST,-500,0,0,0,SWP_NOSIZE);绝对可以。14楼只是先让你试试而已。问题如果没解决就说没解决,一定会努力帮你解决。但再提新问题就应该开贴。以后你的问题我当然不会再关注,只不过这次既然骑虎难下,只好继续帮你解决问题。提醒一下:隐藏窗体其实可以将窗体移到屏幕之外,这样人就看不到了,类似达到隐藏的效果,但绝不会激发原窗体的隐藏事件,针对你的问题,SetWindowPos可以解决了。不知道下一步你还有什么理由拖时间不结贴?
      

  15.   

    你说的这个方案我也知道,但前提也是窗口运行出来之后,才控制它移动,所以也避免不了“闪一下”的问题,如果是一个很小的启动加载很会的程序,你可能看不到闪,但是如果是一个比较大的程序,启动加载较慢,瞬间占用资源较高的,你就能看到“闪”的效果了。而且后续弹出的窗体如果以它为center的话,你怎么知道什么时候再把它移动回来呢(不能根据后续弹出窗体的句柄控制,因为目标程序是不确定的)?另外我也还知道另外一个方案,就是创建一个不可见的虚拟桌面,并让目标程序在那个虚拟桌面上运行。但这样也有一个问题,就是因为那个虚拟桌面是另外一个线程创建的,所以在这个程序退出并弹出frmMain的时候,我们还要保证将其移动回来到我们看得到的这个桌面上来。但这两个桌面不是一个进程,所以控制起来就麻烦了。并且事实上,我也不知道那个frmMain到底什么时候启动了,不知道前面的这个小窗口是否弹出错误提示消息,不知道什么时候应该把程序线程移动回来。所以这个方案也不可行。帖子发出来是需要大家讨论,思考和解决问题的,并对以后检索到的人提供帮助,CSDN最初的宗旨也是这样。你怎么就把分看这么重呢,即使有10000000000000专家分,你又能用它干什么呢,这点你还没想通?只不过是个符号而已。分高低,并不能反映你的水平高低。
    有的人分不高,但并不能说明他水平低。
      

  16.   

    闪一下的问题肯定可以解决,只不过那是另一个新问题。如果你愿意给分,重赏之下必有勇夫。只不过闪的问题比本贴中的问题解决起来更为困难。我是就事论事,本贴的问题是隐藏窗体而不关。如果你因为解决不了“闪”的问题而不结贴,那就算了,我算是看清你面目了。我知道,如果给你解决了,你肯定又会冒出来另一个问题而继续不结贴。所以我不再说什么了。正如你所说,相信CSDN上少我一个,并不会有什么变化,你的问题不会因为我的不继续回答而不被其它人解决。