在很多情况下按ctrl+alt+del,都会让对话框消失。比如我锁定之后,然后ctrl+alt+del,然后进入WlxWkstaLockedSAS 等待密码验证。在等待密码验证的过程中,如果用户输入的不是密码,而是ctrl+alt+del的时候,系统就会自动跳过密码验证,直接返回系统。 又比如,在系统登陆后,ctrl+alt+del。进入WlxLoggedOnSAS ,然后继续按ctrl+alt+del。对话框会消失不见,只剩墙纸。然后再继续ctrl+alt+del 对话框会重新出现。而且这种情况下,用普通的OpenMutex无法屏蔽。例如
int WINAPI WlxWkstaLockedSAS(PVOID pWlxContext, DWORD dwSasType)
{
DEBUG_MSG("WlxWkstaLockedSAS");
// return theApp.MyWlxWkstaLockedSAS(pWlxContext,dwSasType);
HANDLE hMutex;
hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "_ac952_z_cn_CTRL_ALT_DEL");
if (hMutex)
{
CloseHandle(hMutex);
        //return WLX_SAS_ACTION_NONE; //将屏幕切换到应用程序桌面,屏蔽掉CTRL+ALT+DEL
}
else
{
hMutex = CreateMutex(NULL,FALSE, "_ac952_z_cn_CTRL_ALT_DEL");
int Result;

Result = pgContext->pWlxFuncs->WlxDialogBoxParam(  pgContext->hWlx,
hDllInstance,
(PWSTR) MAKEINTRESOURCE(IDD_DLG_UNLOCK),
NULL,
UnLockProc,
(LPARAM)pgContext);
ReleaseMutex(hMutex);
return Result;
}
    
//return(WLX_SAS_ACTION_LOCK_WKSTA);
}log日志为
WlxLoggedOnSAS   //第一次ctrl+alt+del 进入LoggedOn
WlxDisplayLockedNotice  //第二次ctrl+alt+del  进入DisplayLockedNotice 显示锁定信息  当前状态已经锁定。
WlxWkstaLockedSAS   //在锁定的状态下ctrl+alt+del 要求验证密码。但是如果在里,依然ctrl+alt+del 则会跳出。然后。。返回系统。。

解决方案 »

  1.   

    hMutex = CreateMutex(NULL,FALSE, "Global\\_ac952_z_cn_CTRL_ALT_DEL");
      

  2.   

    比如我锁定之后,然后ctrl+alt+del,然后进入WlxWkstaLockedSAS 等待密码验证。在等待密码验证的过程中,如果用户输入的不是密码,而是ctrl+alt+del的时候,系统就会自动跳过密码验证,直接返回系统。
    ======================================
    这种情况可以在系统中设置的,具体怎么设置忘掉了。
    楼主可以上网查查,好像是把guest用户停掉,
    不大清楚了。
      

  3.   

    to miaoshengwu(努力、努力、再努力……) 
    这个和系统没关系。整个gina程序是自己写的。windows系统自带的gina就没有问题
      

  4.   

    to jiangsheng(蒋晟.Net[MVP]) 
    即使不加Global\\ 那个mutex也可以创建成功。
    这样创建了还是不能屏蔽ctrl+alt+del.
      

  5.   

    有谁知道ctrl+alt+del的消息到底是在哪处理的?
    做过gina的各位大大。。你们有碰到过这种问题吗?调用自己的密码登陆方式。
    另外,有没有人知道msgina的pWlxContext 结构体?网上看到的结构体基本都是自己定义的。。和msgina不能兼容。所以当修改logout的时候就必须连带logon也一起修改了。
      

  6.   

    呵呵,谢谢大哥。。
    因为回复3篇之后不能再回复。所以拖他来给我顶一下
    问题解决了。解决的办法是用
    WlxSasNotify(pgContext->hWlx,WLX_SAS_TYPE_CTRL_ALT_DEL)
    在GINA里,按ctrl+alt+del的时候,如果那个窗口可以被取消掉,窗口依然会返回一个值WLX_DLG_SAS  (101)
    所以当获得这个消息的时候,说明这个dlg被sas干掉了。然后,如果要保护这个dlg的话,就可以自己去控制gina的运行机制。我更改的机制:
    int WINAPI WlxWkstaLockedSAS(PVOID pWlxContext, DWORD dwSasType)
    {
    DEBUG_MSG("WlxWkstaLockedSAS");
    Result = pgContext->pWlxFuncs->WlxDialogBoxParam(  pgContext->hWlx,
    hDllInstance,
    (PWSTR) MAKEINTRESOURCE(IDD_DLG_UNLOCK),
    NULL,
    UnLockProc,
    (LPARAM)pgContext);
    DEBUG_MSG("%d",Result);
    if (Result == WLX_DLG_SAS)
    {
    g_nDisableLock = 1;
    pgContext->pWlxFuncs->WlxSasNotify(pgContext->hWlx,WLX_SAS_TYPE_CTRL_ALT_DEL);
    }
    else
    {
    g_nDisableLock = 0;
    }
    return Result;    
    //return(WLX_SAS_ACTION_LOCK_WKSTA);
    }int WINAPI WlxLoggedOnSAS(PVOID pWlxContext,
      DWORD dwSasType,
      PVOID pReserved)
    {
    DEBUG_MSG("WlxLoggedOnSAS");
    // if (!pgContext->pWlxFuncs->WlxSwitchDesktopToUser(pgContext->hWlx))
    // {
    // DEBUG_MSG("WlxSwitchDesktopToUser success");
    // }
    // return theApp.MyWlxLoggedOnSAS(pWlxContext,
    //                            dwSasType,
    //    pReserved); PGINA_CONTEXT pgContext = (PGINA_CONTEXT)pWlxContext;
    int SasAction = WLX_SAS_ACTION_NONE;
    if (g_nDisableLock == 0)
    {

    SasAction = pgContext->pWlxFuncs->WlxDialogBoxParam(  pgContext->hWlx,
    hDllInstance,
    (PWSTR) MAKEINTRESOURCE(IDD_DIALOG_LOGON),
    NULL,
    OptionsDlgProc,
    (LPARAM) pWlxContext ); }
    else if (g_nDisableLock == 1)
    {
    SasAction = WLX_SAS_ACTION_LOCK_WKSTA;
    }
    return SasAction;
    //return WLX_SAS_ACTION_NONE;
    }
      

  7.   

    楼主可否发一份给我呢?最近也在做屏蔽ctrl+alt+del的,正愁着没地方找些参考呢。谢了,兄弟!
      

  8.   

    http://community.csdn.net/Expert/topic/5632/5632621.xml?temp=.5162165
    我整理了一份资料在这里。:)