如何关闭我的WINDOW(50分)

  • 主题发起人 主题发起人 xzg163
  • 开始时间 开始时间
X

xzg163

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大侠:<br>请帮个忙,我自己编了一个对话的小程序,其中用到WINSOCKET,并且在运行时<br>使用showwindow函数把把该窗口隐含,只在任务的右侧留下一个图表,如输入<br>法类似,一切功能可以正常实现,但要关闭WINDOW时就关不掉,所有操作,例如<br>重新启动计算机,关闭计算机,一确定,好象是闪烁了一下,就回到WINDOW,<br>一切跟正常一样,最后只有两种办法关机:1是用热启动把该程序结束任务,然后<br>关机,2是关电源了,各位兄弟能否尽快帮忙。
 
在windows下好象有一个api可以无条件的kill掉所有的进程。ExitWindowsEx(UINT uFlags,DWORD dwReserved);就适应了我们的要求,其功能有:关闭WINDOWS,重新启动WINDOWS等,首先需要定义常数: <br>const<br>EWX_FORCE=4;//关闭所有程序并以其他用户身份登录<br>EWX_LOGOFF=0;//重新启动计算机并切换到MS-DOS方式<br>EWX_REBOOT=2;//重新启动计算机<br>EWX_SHUTDOWN=1;//关闭计算机<br><br>  <br><br>
 
我说的意思是我的程序的运行影响了WINDOW的关闭,这个影响是怎么产生的,<br>如何消除?
 
我不清楚你程序是如何遍的,不过可以试试处理消息:<br><br>WM_QUERYENDSESSION<br><br><br>处理WM_QUERYENDSESSION时返回True
 
ExitWindowsEx <br><br>VB声明 <br>Declare Function ExitWindowsEx Lib "user32" Alias "ExitWindowsEx" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long <br>说明 <br>退出windows,并用特定的选项重新启动 <br>返回值 <br>Long,非零表示成功,零表示失败。会设置GetLastError <br>参数表 <br>参数 类型及说明 <br>uFlags Long,指定下述一个或多个标志(用OR运算符合并到一起) <br>EWX_FORCE 强迫中止没有响应的进程 <br>EWX_LOGOFF 中止进程,然后注销 <br>EWX_SHUTDOWN 关掉系统电源(如果可能的话,ATX电源就可以) <br>EWX_REBOOT 重新引导系统 <br>EWX_SHUTDOWN 关闭系统 <br>dwReserved Long,保留,设为零 <br>注解 <br>这个函数调用后会立刻返回,系统关闭过程是在后台进行的。注意先中止自己的应用程序,使关闭过程更显平顺。当然,您的进程必须有足够的优先权,否则也不能执行这种操作 <br>
 
Winsock的问题,关注。
 
我对我的程序的特点再说明一下:<br>1。我的程序主要是用WINSOCKET来进行对话,采用SOCKET 的C/S通讯方式,<br>2。在客户端,我把程序隐含起来(FORM HIDE),同时利用SHOWWINDOW函数把该<br>窗口在任务栏的图标也去掉,只在任务栏右侧(显示输入法的地方)显示一个小图标。<br>3。客户端的程序由于具有隐蔽的目的,所以没有直接对该程序关闭的操作,也就是<br>说,除了用结束任务的方法外,该程序没有被正常关闭的手段,这些特点是我自己<br>要求要达到的。而且也一切正常。<br>4,问题出现在哪里?那就是我要关闭WINDOW,由于上述程序的存在,使得WINDOW<br>不能关闭,我也不知道问题出在那里,只希望各位高手能指点问题之所在。有什么<br>方法可以实现正常化。
 
如果你的机器是NT,请你先用API获得一系列的特权。<br>参数里加上 or ewx_force.
 
检查一下你Form的OnCloseQuery中的CanClose是否设置成了false. 如果不是你自己<br>设置的那就有可能是你使用的TrayIcon控件更改了这项设置.
 
在CLOSEQUERY处我没有做任何的变动<br><br><br>我在程序中比较特别的地方,就是把程序隐含并在右下方生成图标的语句如下:<br>首先定义:CONST MY_MESSAGE:=WM_USER+100;<br><br>PROCEDURE Tform.oncreate.....;//在CREATE 事件<br>VAR nid:TNotifyIconData;<br>begin<br>nid.cbsize:=sizeof(nid);<br>nid.Wnd:=Handle;<br>nid.uID:=2180570;<br>nid.hIcon:=Apllication.Icon.Handle;<br>nid.szTip:='信息发布';<br>nid.uCallbackMessage:=MY_MESSAGE;<br>nid.uFlags:=NIF_ICOn or NIF_TIP or NIF_MESSAGE;<br>IF NOT SHELL_NotifyIcon(NIM_ADD,@nid) then<br>begin<br>//<br>end;<br>showwindow(Findwindow(nid,@Application.Title[1]),sw_hide);<br>//其他普通内容<br>end;<br>
 
关注!!!
 
估计你使用了delphi带来的 NM 的tcp/ip控件?(TNM...)<br>如果是, 那控件会阻止windows退出。<br>推荐ics控件:http://www.rtfm.be/fpiette/indexuk.htm
 
检查一下你Form的OnCloseQuery中的CanClose是否为true <br>
 
pipi:<br><br>你好,我是用了WINSOCK,也用了UDP控件。<br>由于我的程序急着要用,如果采用新控件得花一些时间,<br>我自己的想法是:是否让程序接收到WINDOW的关机信息时,让SOCKET关掉。<br>但不知道那位大侠能指点一下:如何写一个事件,当它接收到关机要求时能够响应。
 
看看这个有没有帮助<br>http://best.163.com/~lulin/CloseNet.txt
 
谢谢各位:<br>我已经自己解决这个问题,各位大侠虽然没有给出答案,但也给我许多提示。<br>谢谢各位,至于分数,那就把这里的50平分给大家。<br>再次谢谢。
 
xzg163:<br>&nbsp; 你好,怎么解决的我想听听,能告诉我吗?<br>&nbsp; 谢谢先!
 
后退
顶部