这个啊!!!
用一般的对话框没法模拟的
用VXD却很简单system.ini里面有一句
trick.vxd
你自己写一个trick.vxd将其替换了就可以了。
试想一下,要在系统登陆前模拟登陆对话框,“开始”菜单的“启动”项里的程序以及注册表RUN中的启动程序此时都还不能获得控制权呢,所以,这只能通过VXD实现。

解决方案 »

  1.   

    以下是一个模拟登陆对话框的VXD
    利用了VTOOSD和VC++6.0
    没有EDIT框供输入密码,这个想来可以利用SHELL调用
    权当参考!// TRICK.h - include file for VxD TRICK#include <vtoolscp.h>#define DEVICE_CLASS TrickDevice
    #define TRICK_DeviceID UNDEFINED_DEVICE_ID
    #define TRICK_Init_Order UNDEFINED_INIT_ORDER
    #define TRICK_Major 1
    #define TRICK_Minor 0class TrickDevice : public VDevice
    {
    public:
    virtual BOOL OnDeviceInit(VMHANDLE hSysVM, PCHAR pszCmdTail);
    };class TrickVM : public VVirtualMachine
    {
    public:
    TrickVM(VMHANDLE hVM);
    };class TrickThread : public VThread
    {
    public:
    TrickThread(THREADHANDLE hThread);
    };
    // TRICK.cpp - main module for VxD TRICK#define DEVICE_MAIN
    #include "trick.h"
    Declare_Virtual_Device(TRICK)
    #undef DEVICE_MAINchar* msg="网络登陆";
    char* cap="请输入你的帐号和密码:";SHELLMessage_THUNK thunk;TrickVM::TrickVM(VMHANDLE hVM) : VVirtualMachine(hVM) {}TrickThread::TrickThread(THREADHANDLE hThread) : VThread(hThread) {}
    void _cdecl shell_exe (PVOID p,DWORD flags)
    {
    struct
    {
    WORD nCmdShow;
    DWORD lpCmdLine;
    }winex;   winex.nCmdShow=3;
       winex.lpCmdLine=SHELL_LocalAllocEx(LMEM_STRING,0,"Explorer.exe",&p);
       SHELL_CallDll("KERNEL","WINEXEC",sizeof(winex),&winex);
       SHELL_LocalFree(winex.lpCmdLine);
    }void _stdcall msgcall(DWORD resid,PVOID refdata)
    {
    SHELL_CallAtAppyTime(&shell_exe,0,0,0);
    }
    void _cdecl tricker(PVOID p,DWORD flags)
    {
    SHELL_Message((VMHANDLE)p,MB_OK,msg,cap,msgcall,0,&thunk);
    }BOOL TrickDevice::OnDeviceInit(VMHANDLE hSysVM, PCHAR pszCmdTail)
    {
    return SHELL_CallAtAppyTime(&tricker,hSysVM,0,0);
    }