如何判断用户已经正常登陆Windows?

flyhigh 2008-01-09 09:44:25
这几天碰到一个很头痛的问题:我开发一个输入法,用户报告说将它设置成默认输入法时,输入法就出错。
问题的关键是我的输入法使用了一个比较特殊的结构:使用一个单独的服务进程来做数据转换,服务进程与输入法之间采用Windows的窗口消息进行通讯。
设置成默认输入法时,在用户登陆的时候,就会启动输入法,而输入法又去启动服务进程。服务进程需要创建窗口等。
我目前没有跟踪服务器在什么时候出的错(僵死在进程列表中),估计是创建一些控件窗口时出了问题。
如果能够判断出用户是不是已经正常登陆就可以解决这个问题。
非常感谢!
测试程序:http://www.setoutsoft.cn/download/sinstar2-u.rar
这是我这个输入法的免安装版本,执行install.exe就可以使用了。
本来服务器启动时也自动启动输入法,输入法又启动服务器,形成死循环,通过在服务器中指定打开英文输入法解决了这个问题。
...全文
455 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
lynx090 2008-01-10
  • 打赏
  • 举报
回复
调试吧~~先用VM运行你的输入法,用WinDbg进行内核调试,然后在内核调试器里启动用户态调试器:ntsd -d -p 服务进程号,然后和调试普通的程序一样了。记得载入源代码啊。

应该按照 jiangsheng 的方式只创建一个服务。
jameshooo 2008-01-10
  • 打赏
  • 举报
回复
你应该在输入法模块中用GetThreadDesktop(GetCurrentThreadId()),然后用GetUserObjectInformation(hDesk,UOI_NAME,...)获得当前桌面的名称,然后根据名称来确定当前桌面是登录桌面、用户桌面还是屏保桌面,你可以只让输入法在用户桌面的情况下才启动服务。
用户桌面:Winsta0\default
登录桌面:Winsta0\Winlogon
屏保桌面:Winsta0\screen-saver
flyhigh 2008-01-10
  • 打赏
  • 举报
回复
to jiangsheng :关心为什么不写成服务,一方面是因为我水平有限,没有用过服务这种模型;另外也考虑到它要在多个平台如98等下工作,做成服务通用性可能不太好。
顺便问一下:服务如何与其它进程通讯?
谢谢!
目前我使用判断任务栏窗口句柄的方法基本解决了启动的问题,但是这应该不是最根本的办法,而且在系统注销的时候还要启动输入法,导致又启动我的服务并显示创建窗口失败消息。
蒋晟 2008-01-10
  • 打赏
  • 举报
回复
那怎么不写成一个服务
hikuers 2008-01-10
  • 打赏
  • 举报
回复
mark
wanshi131 2008-01-10
  • 打赏
  • 举报
回复 1
你在你的服务程序的入口判断一下是否运行了explorer.exe
没有运行就直接退出
flyhigh 2008-01-10
  • 打赏
  • 举报
回复
to jiangsheng :通讯都没有问题(我是采用消息+内存映射文件一起完成通讯的)。问题也不是启动了多个服务。问题的关键在于服务在系统还没有登陆就被请求启动。而我这个服务不是一个真正的服务,仅仅是一个包含窗口的普通应用程序。
jameshooo 2008-01-10
  • 打赏
  • 举报
回复
是啊,你只要发现当前桌面是Default就可以启动服务进程,如果不是,说明你的输入法是在其它桌面启动的(比如登录桌面),此时就可以不用启动服务了。你说的问题正好是注销时切换到了winlogon桌面,这个桌面也会启动默认输入法,所以你的服务又被启动了。
flyhigh 2008-01-10
  • 打赏
  • 举报
回复
to jameshooo : 您提供的方法好象可行,但是在我的机器上测试,当前用户桌面的名称是“Default",系统是XP+SP2,会不是与系统相关?
flyhigh 2008-01-09
  • 打赏
  • 举报
回复
其实我写的服务不是真正的服务,它只是一个普通的窗口程序。
在输入法里用COM这样的技术不好用。
jameshooo 2008-01-09
  • 打赏
  • 举报
回复
服务创建窗口?容易产生问题,服务本身就不是用来处理窗口的,而且在vista下服务与用户桌面已经分离到不同的session中了,根本不能跨session访问窗口。
建议你做一个进程外服务器,这样进程外服务器被你的输入法启动后将工作在当前用户桌面,可以任意使用窗口,也可以不使用窗口,提供com接口供输入法模块调用,使用起来也很方便。
flyhigh 2008-01-09
  • 打赏
  • 举报
回复
输入法设置成默认时,用户登陆时就会去启动输入法。
skytiger_z 2008-01-09
  • 打赏
  • 举报
回复
re.
goodmrning 2008-01-09
  • 打赏
  • 举报
回复
帮顶
jwybobo2007 2008-01-09
  • 打赏
  • 举报
回复
给个也许有帮助的建议, 判断 WINDOWS 开始菜单任务栏 是否存在应该就可以了
r_swordsman 2008-01-09
  • 打赏
  • 举报
回复
你的输入法就设计的不对吧?
设置为默认输入法就要在登录时启动?
wanshi131 2008-01-09
  • 打赏
  • 举报
回复
可以在Winlogon通知里判断用户登录,但是不能解决你的问题
你可以换一种通信方式,在vista下是不允许交互服务的。
关注!
蒋晟 2008-01-09
  • 打赏
  • 举报
回复
你可以创建一个全局的Mutex(名字以Global\\开头)来判断服务有没有启动。
你也可以使用其他的通讯方式,比如内存映射文件、命名管道或者RPC

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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