当前位置:编程学习 > C#/ASP.NET >>

急!如何捕获电脑开关机,登陆,注销事件,高手请进!!!

如何捕获电脑开关机,登陆,注销事件,可以实现吗?在线等。 --------------------编程问答-------------------- 自己顶 --------------------编程问答-------------------- mark --------------------编程问答-------------------- 开机没办法 除非你写bios
登录有办法 通过gina
注销        hook ExitWindow之类的函数 --------------------编程问答-------------------- 我知道关机,重起,注销时系统会发WM_QUERYENDSESSION 和 WM_ENDSESSION消息。
请问login 和 logoff有什么特殊的消息? --------------------编程问答-------------------- logoff 不就是关机重启注销中的一种
login会有什么消息不知道
--------------------编程问答-------------------- 我就是想区分关机,重起,和注销,不知道还有什么参数没? --------------------编程问答-------------------- hook BOOL WINAPIExitWindowsEx(UINT uFlags,
    DWORD dwReserved)

对于这个  有跟的参数决定是关机重启还是注销

InitiateSystemShutdown(
    LPSTR lpMachineName,
    LPSTR lpMessage,
    DWORD dwTimeout,
    BOOL bForceAppsClosed,
    BOOL bRebootAfterShutdown
    )

这个参数没详细研究 不知道有没有标注的
--------------------编程问答-------------------- up --------------------编程问答-------------------- 小弟我是搞java的,但java却没办法实现,
还请各位能够具体点,真是急煞小弟我也.
能有个例子最好,谢谢! --------------------编程问答-------------------- 还有开机登陆和注销登陆有没有什么方法区分呢?谢谢! --------------------编程问答-------------------- mark一下,我也想知道 --------------------编程问答-------------------- C++ 6.0    VC++ .NET   都可以实现 gina  

  gina 中有18个函数, 只要你舍得研究.  你那个要求, 只不过是一个小儿科, --------------------编程问答-------------------- 我做过登录,  只是代码不在身边了, --------------------编程问答-------------------- mark一下,我也想知道 --------------------编程问答-------------------- 寫一個windows服務,在啟動服務(開機)及停止服務(關機)進寫到win log中 --------------------编程问答-------------------- Microsoft.Win32.SystemEvents.SessionSwitch 更改当前用户事件
Microsoft.Win32.SystemEvents.SessionEnding 注销或关闭系统时的事件 --------------------编程问答-------------------- mark一下,我也想知道 --------------------编程问答-------------------- win log是什么意思啊,?能否解释一下 --------------------编程问答-------------------- mark一下,我也想知道
--------------------编程问答-------------------- 完整示例:
http://blog.csdn.net/ChengKing/archive/2005/12/24/561259.aspx --------------------编程问答-------------------- 自己再顶一下,我就是想捕捉开机,关机,注销,登陆这4个事件,并做些事情.
不是要做自动关机什么的,还请各位献计献策,谢谢!
--------------------编程问答-------------------- 还有gina是什么东东,哪里可以找到它的文档? --------------------编程问答-------------------- 开机是不可能的呢。 --------------------编程问答-------------------- 开机启动服务不行么? --------------------编程问答-------------------- UP --------------------编程问答-------------------- 路过,看看 --------------------编程问答-------------------- 该回复被版主删除 --------------------编程问答-------------------- mark --------------------编程问答-------------------- 有这样一个事件内容.就是在窗体关闭的时候你可以判断这个是用户关闭.还是系统关机或者重新启动的时候关闭.不过至于你说的那个开机登陆跟注销登陆就不知道如何去监视了,
  在WINDOW COLOSING事件去判断 
            if (e.CloseReason == CloseReason.windowsshutdown)
                {
                    //你要做的事             
                } --------------------编程问答-------------------- using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace ShutDown
{
    public class ExitWindows
    {
        [StructLayout(LayoutKind.Sequential, Pack = 1)]//公共语言运行库利用StructLayoutAttribute控制类或结构
        //的数据字段在托管内存中的物理布局,即类或结构需要按某种方式排列。
        //LayoutKind分为三种方式排列非托管内存:Auto、Explicit、Sequential
        //当选择用Sequential时需要用Pack规定大小。Pack的值为: 0, 1, 2, 4, 8, 16, 32, 64, 128
        internal struct TokPriv1Luid
        {
            public int Count;
            public long Luid;
            public int Attr;
        }
        [DllImport("kernel32.dll", ExactSpelling = true)]
        internal static extern IntPtr GetCurrentProcess();//得到当前进程的伪句柄。
        
        [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
        internal static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok);//打开进程相联系的access token
        //access token (通道令牌?)是包含一个会话的安全信息

        [DllImport("advapi32.dll", SetLastError = true)]
        internal static extern bool LookupPrivilegeValue(string host, string name, ref long pluid);//用于得到一个权限的本地唯一标识

        [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
        internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall,//赋予或解除一个access token的特权
            ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);

        [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
        internal static extern bool ExitWindowsEx(int flg, int rea);//重启、注销、关闭计算机

        internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
        internal const int TOKEN_QUERY = 0x00000008;
        internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
        internal const int TOKEN_ADJUST_DEFAULT = 0x0080;//以下TOKEN的值本例中没有用到
        internal const int TOKEN_ADJUST_GROUPS = 0x0040;
        internal const int TOKEN_ADJUST_SESSIONID = 0x0100;
        internal const int TOKEN_ASSIGN_PRIMARY = 0x0001;
        internal const int TOKEN_DUPLICATE = 0x0002;
        internal const long TOKEN_EXECUTE = 0x20000L;
        internal const int TOKEN_IMPERSONATE = 0x0004;
        internal const int TOKEN_QUERY_SOURCE = 0x0010;
        //internal const int TOKEN_READ=0x200e0L;
        internal const long TOKEN_WRITE = 0x200e0L;
        internal const long TOKEN_ALL_ACCESS = 0xf00ffL;
        internal const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
        internal const int EWX_LOGOFF = 0x00000000;
        internal const int EWX_SHUTDOWN = 0x00000001;
        internal const int EWX_REBOOT = 0x00000002;
        internal const int EWX_FORCE = 0x00000004;
        internal const int EWX_POWEROFF = 0x00000008;
        internal const int EWX_FORCEIFHUNG = 0x00000010;
        public ExitWindows()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }
        public bool DoExitWindows(int how)//执行
        {
            bool ok;
            TokPriv1Luid tp;
            IntPtr hproc = GetCurrentProcess();//IntPtr是平台提供的一个结构体。它用于描述一个指针或句柄
            IntPtr htok = IntPtr.Zero;//IntPtr.Zero只读属性。用于初始化一个指针或句柄
            ok = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok);
            tp.Count = 1;
            tp.Luid = 0;
            tp.Attr = SE_PRIVILEGE_ENABLED;
            ok = LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref tp.Luid);
            ok = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);
            switch (how)
            {
                case 0:
                    ok = ExitWindowsEx(EWX_LOGOFF, 0);
                    break;
                case 1:
                    ok = ExitWindowsEx(EWX_SHUTDOWN, 0);
                    break;
                case 2:
                    ok = ExitWindowsEx(EWX_REBOOT, 0);
                    break;
                case 3:
                    ok = ExitWindowsEx(EWX_FORCE, 0);
                    break;
                case 4:
                    ok = ExitWindowsEx(EWX_POWEROFF, 0);
                    break;
                case 5:
                    ok = ExitWindowsEx(EWX_FORCEIFHUNG, 0);
                    break;
            }
            return ok;
        }

    }
} --------------------编程问答-------------------- const int WM_QUERYENDSESSION = 0x0011;
       protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {

                case WM_QUERYENDSESSION:
                    this.Close();
                    this.Dispose();
                    Application.Exit();

                    //m.Result = (IntPtr)0;
                    break;
                default:
                    break;
            }
            base.WndProc(ref m);
        }
放在你的mainForm.cs里
这个是截获重启和关机的例子
结合上面一个我发的应该可以解决了. --------------------编程问答-------------------- 直接添加一个开机/关机和注销/登录脚本不就结了么
还这么麻烦干什么啊 --------------------编程问答-------------------- 看              看 --------------------编程问答-------------------- http://blog.csdn.net/hwenycocodq520 哈哈,请关注我的博客,很快我就把你需要知道的写在上面~~ --------------------编程问答-------------------- 先开启策略审核
  单击 开始 , 然后单击 控制面板 。
  双击 管理工具 , 并双击 本地安全设置 。
  展开 本地策略 , 然后展开 审核策略 。
  在右窗格中, 双击 审核系统事件 。
  单击以选中 成功 复选框, 并单击 确定 。
读取系统日志中的开机、关机、注销、登录事件。代码如下:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text;

using System.Diagnostics;

public partial class Default3 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
     {
        //Windows日志有:"Application"应用程序, "Security"安全, "System"系统
        string[] logs = new string[] { "Application", "System" };

         StringBuilder result = new StringBuilder();

        foreach (string log in logs)
         {
             EventLog myLog = new EventLog();
             myLog.Log = log;
            //myLog.MachineName = "rondi-agt0qf9op";
            foreach (EventLogEntry entry in myLog.Entries)
             {
                //EventLogEntryType枚举包括:
                //Error 错误事件。
                //FailureAudit 失败审核事件。
                //Information 信息事件。
                //SuccessAudit 成功审核事件。
                //Warning 警告事件。
                if (entry.EntryType == EventLogEntryType.Error || entry.EntryType == EventLogEntryType.Warning)
                 {
                     result.Append("<font color='red'>" + log);
                     result.Append(entry.EntryType.ToString() + "</font>");
                     result.Append("<font color='blue'>(" + entry.TimeWritten.ToString() + ")</font>:");
                     result.Append(entry.Message + "<br /><br />");
                 }
             }
         }
         Response.Write(result.ToString());
     }
} --------------------编程问答-------------------- 其实吧,我觉得可以脱离系统调用的概念。。。。


直接系统用自身的。。

比如系统关机:调用一个文件作为标识,
    系统开机,调用一个文件作为标识
    系统注销,调用一个文件作为标识。。。。


上面我只是打个比方。。。。
如果实在没有办法,又想开机时,去做某件事情,关机时,去做某件事情,或者注销时,去做某件事情,那么可以考虑初始化三个标识。以后想干什么就根据这个标识效果来区分开机,关机,还是注销。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,