给你个提示,网上抄得,这个问题也的确遇到过,在你程序中改写窗口过程,让他忽略掉WM_ENDSESSION事件,这样就无法关机了。比如你设置个全局变量MyCanClose,然后在FormClose事件中设置MyCanClose:= true,然后在窗口过程得WM_ENDSESSION事件分支中不断检测这变量就可以了:
WM_ENDSESSION:
if MyCanClose then
TWMEndSession(Message).EndSession;
==================================
FastNet里面NMUDP造成无法关机
原因:
TNMXXX控件有BUG。所有nm控件的基础 PowerSocket用到的ThreadTimer,用到一个隐藏
的窗口(类为TmrWindowClass)处理有硬伤。
出问题的地方:
Psock::TThreadTimer::WndProc(var msg:TMessage)
if msg.message=WM_TIMER then
他自己处理
msg.result:=0
else
msg.result:=DefWindowProc(0,....)
end
问题就出在调用 DefWindowProc时,传输的HWND参数居然是常数0,这样实际上
DefWindowProc是不能工作的,对任何输入的消息的调用均返回0,包括
WM_QUERYENDSESSION,所以不能退出windows。由于DefWindowProc的不正常调用,实际
上除WM_TIMER,其他消息由DefWindowProc处理都是无效的。
解决的办法是在 PSock.pas
在 TThreadTimer.Wndproc 内
Result := DefWindowProc( 0, Msg, WPARAM, LPARAM );
改为:
Result := DefWindowProc( FWindowHandle, Msg, WPARAM, LPARAM );