求教,请问在服务程序中如何知道Windows已登录?

ljianq 2006-01-13 09:24:14
如题.
...全文
128 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
蒋晟 2006-01-15
  • 打赏
  • 举报
回复
下面的代码列出控制台用户的用户名
Topic in microsoft.public.vc.language
FindWindow() to terminal service clients

BOOL ShowConsoleUsernameFromSystem(void)
{
HDESK hdeskCurrent;
HDESK hdeskTest;
HDESK hdesk;
HWINSTA hwinstaCurrent;
HWINSTA hwinsta;
// Save the current Window station
hwinstaCurrent = GetProcessWindowStation();
if (hwinstaCurrent == NULL)
return FALSE;
// Save the current desktop
hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
if (hdeskCurrent == NULL)
return FALSE;
// Obtain a handle to WinSta0 - service must be running
// in the LocalSystem account
hwinsta = OpenWindowStation("winsta0", FALSE,
WINSTA_ACCESSCLIPBOARD |
WINSTA_ACCESSGLOBALATOMS |
WINSTA_CREATEDESKTOP |
WINSTA_ENUMDESKTOPS |
WINSTA_ENUMERATE |
WINSTA_EXITWINDOWS |
WINSTA_READATTRIBUTES |
WINSTA_READSCREEN |
WINSTA_WRITEATTRIBUTES);
if (hwinsta == NULL)
return FALSE;
// Set the windowstation to be winsta0
if (!SetProcessWindowStation(hwinsta))
return FALSE;
// Get the desktop
hdeskTest = GetThreadDesktop(GetCurrentThreadId());
if (hdeskTest == NULL)
return FALSE;
// Get the default desktop on winsta0
hdesk = OpenDesktop("default", 0, FALSE,
DESKTOP_CREATEMENU |
DESKTOP_CREATEWINDOW |
DESKTOP_ENUMERATE |
DESKTOP_HOOKCONTROL |
DESKTOP_JOURNALPLAYBACK |
DESKTOP_JOURNALRECORD |
DESKTOP_READOBJECTS |
DESKTOP_SWITCHDESKTOP |
DESKTOP_WRITEOBJECTS);
if (hdesk == NULL)
return FALSE;
// Set the desktop to be "default"
if (!SetThreadDesktop(hdesk))
return FALSE;
// Get registry entries
{//really, this is a separate function, just inserted here for ease:
char szUserName[256]={0};
char szDomainName[256]={0};
DWORD type,size;
HKEY hKeyWinlogon = 0;
// Open the registry key to WinLogon entries:
RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
"Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",
0,
KEY_READ,
&hKeyWinlogon );


// Get the strings from entries:
size = sizeof(szUserName);
RegQueryValueEx(
hKeyWinlogon,
"DefaultUserName",
0L,
&type,
(LPBYTE)szUserName,
&size);
size = sizeof(szDomainName);
RegQueryValueEx(
hKeyWinlogon,
"DefaultDomainName",
0L,
&type,
(LPBYTE)szDomainName,
&size);


RegCloseKey(hKeyWinlogon);
szUserName[120]='\0';
szDomainName[120]='\0';
strcat(szDomainName,"\\");
strcat(szDomainName,szUserName);
MessageBox(NULL, (char *)szDomainName, "User at Console:", MB_OK);
}//end of inserted function
// Reset the Window station and desktop
if (!SetProcessWindowStation(hwinstaCurrent))
return FALSE;


if (!SetThreadDesktop(hdeskCurrent))
return FALSE;
// Close the windowstation and desktop handles
if (!CloseWindowStation(hwinsta))
return FALSE;


if (!CloseDesktop(hdesk))
return FALSE;
return TRUE;
}
对于Windows终端服务器,WinSta0可能不是登录用户的windows station,这时你要调用WTSRegisterSessionNotification来截获用户登录消息。在这之前,需要判断终端服务的状态。
参见
http://msdn.microsoft.com/library/en-us/termserv/termserv/detecting_the_terminal_services_environment.asp
ljianq 2006-01-14
  • 打赏
  • 举报
回复
自己顶
ljianq 2006-01-13
  • 打赏
  • 举报
回复
自己顶
hyj_828 2006-01-13
  • 打赏
  • 举报
回复
你要干啥?
AutoLISP 培训教程 单元一:AutoLISP 主角潇洒登场 一. AutoLISP 是何方神圣? 1、AutoLISP 是 AutoCAD 的最佳拍檔! 2、AutoLISP 内含于 AutoCAD 软件内,不用另外花钱买! 3、AutoLISP 是强化 AutoCAD 最好、最直接的『程序语言』! 4、AutoLISP 易学、易用,即使不会程序设计的 AutoCAD 使用者,都能在最短的 时间内,写出令人惊 讶、赞叹的功能! 若说 AutoLISP 的出现,是替 AutoCAD 创造一片天的『最大功臣』,实不为过一点也不夸张! 5、AutoLISP 希望您去学习它、改善它、发挥它、享受它.真的!它的威力、魅力无穷! 二. AutoLISP 程序语言的特质分析: 学习 AutoLISP 是非常容易的,对初学者而言,即使没有学习过任何的程序语言,都能很快的上手,写 出精彩漂亮的 AutoLISP 程序! 语法简单:不用特殊的变量宣告,非常富有弹性,比起其它的程序语言,它的语法可说是非常简单而 有其独特的风格! 功能函数强大:除一般性的功能函数外,又拥有为数不少控制配合 AutoCAD 的特殊函数,再加上 AutoLISP 可直接呼叫执行所有 AutoCAD 的指令,以及掌握运用所有的 AutoCAD 系统变量,功能之强 大令人欣喜不已! 撰写的环境不挑剔:只要是一般的文书编辑软件都适用! 如:Windows 的记事本、PE2、PE3、DW3、 书仙、汉书、EDIT....等 直译式程序: 不用再作编译,『即写即测、即测即用』,马上可以在 AutoCAD 响应效果,马上就 有成就感! 横跨各作业平台:悠然自得,虽然 AutoCAD 有 DOS、Windows 版本之分但是 AutoLISP 却可在不改 写的原貌下,加载与执行! 三.撰写 AutoLISP 的动机? 1、欲强化 AutoCAD 原有指令时. 2、欲创造更有用的 AutoCAD 新指令. 3、欲简化繁琐的环境设定或绘图步骤时. 4、欲处理参数式绘图时. 5、欲做图面资料读文件、写文件. 6、欲做 AutoCAD 演示文稿展示时. 7、欲达到真正灵活掌控 AutoCAD 时. 8、欲提升自己跨上 AutoCAD 高手列车时. 四.AutoLISP 的效益评估? 1. 对公司负责人或设计主管而言: A. 也许某员工或干部花了 20 个小时撰写一个 AutoLISP 程序,表面上,这将近三天的时间,他连一张 图都没有画,甚至可能偶有发呆、沉思,若此程序一天可以替公司绘图部门节省 1 小时绘图时间,那 算一算,只要 20 天就抵销开发成本,而 20 天以后都是赚的,『用的愈久,省的愈多』! B. 若员工皆有此动力,在不影响正常工作,『鼓励』都来不及,那有『压抑』的道理,甚至还要派遣优 秀人员出去受训,学习更好的设计技巧与创意呢?! C. 千万不要因为您的不懂或压抑,SHOW 您的权威与 POWER,如此,不但对员工造成打击,甚至您可 能成为阻碍了公司计算机化进步的罪魁祸首 D. 当然,若要撰写的程序很多,内部设计人员的程序功力距离太远,达成需求的时间反而变得遥遥 无期,那倒不如求助于市面上已有的相关 AutoCAD 支持软件。 2. 对设计人员而言: A. 得到一笔提升绩效奖金呢? 当然,无形,『AutoCAD 高手的封号』也将黄功力又往前迈出了一 大步,对个人的成长帮助匪浅,幸运的话,搞不好还可以袍加身,不亦乐乎!!! B. 『半桶水、响叮当』,千万不要因为会写 AutoLISP 程序而自傲、孤僻、嚣张起来,功力的增长, 只是让您有更多『服务他人、服务公司』的机会,若自恃过重,宁可不要! C. AutoLISP 程序功力的累进,是无远弗届的,千万不要『孤芳自赏』,『人外有人,天外有天』,也许 您觉得是『宝贝加三级』的程序,只是其它设计师基本程序的一部份罢了! D. 既然 AutoLISP 是 AutoCAD 的『最大功臣』,当然不会轻易被舍弃,如此,您的学习,保证不会白 费! E. 『精益求精』、『虚心求教』、『用心学习、观摩』、『决心成为高手』 3.对程序本身而言: A. 少少的几行,却可能有『大大满意』的时候!!! B. 充份掌握了控制、 创造 AutoCAD 的 『尚方宝剑』 ,让您在 AutoCAD 的设计运作 『得心应手』 , 享受无比的快乐与成就感!!! 五.如何有效的学习 AutoLISP ? 1、先由小程序着手,认识 AutoLISP 语法规定! 2、浏览所有的 AutoLISP 功能函数,重要的功能函数要熟记脑海,俗语说的好『一回生,二回熟』, 除非您不用心,否则没有学不好的道理!!! 3、要懂得偷懒:不要认为在绘图的过程,繁琐的步骤是

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧