一个服务程序打开/创建了一个WindowStation
并在该WindowStation上创建自己的Desktop
现在需要实现从登录到该计算机的用户进程向该服务发送消息
所以希望能SendMessage
可是仅服务程序自己的消息能收到
其他进程检查IsWindow()就失败
所以不能SendMessage,发了消息服务程序也收不到
应该是由于跨WindowStation或Desktop
哪位大侠有类似经验,请不吝赐教
并在该WindowStation上创建自己的Desktop
现在需要实现从登录到该计算机的用户进程向该服务发送消息
所以希望能SendMessage
可是仅服务程序自己的消息能收到
其他进程检查IsWindow()就失败
所以不能SendMessage,发了消息服务程序也收不到
应该是由于跨WindowStation或Desktop
哪位大侠有类似经验,请不吝赐教
解决方案 »
- 从文档类获得多视图类其中一个类的指针
- 关于枚举类型跟其他类型之间的转换问题
- 故障代码是8001010d,描述为因为应用程序正在发送一个输入同步呼叫,所以无法执行传出的呼叫
- VERIFY有什么用
- 关于Word插件的问题? 我急呀!!!!!!,希望高手前来相救,再搞不出来,饭碗不保呀!
- vc.net编译时报“无符号信息:.exe并不包含调试信息”是怎么回事??要设置哪里才能可以调试呢?
- 自己创建的继承自CScrollView的CListCtrl控件的消息映射为什么无效?
- 关于ReadFile函数的问题!
- 提醒版主注意:目前的论坛人气太差了!
- 有谁知道MSDN Library - April 2002应该怎么安装
- vc++中的一个BUG?!
- 节点连接问题
尝试ing................
做了十年的开发,还没有忘了需要消息循环,呵呵
准备用SINGLETON的COM Service解决问题,抛弃用SendMessage的方案
不过这个问题还是请继续讨论,毕竟应该是没有遇到过的问题,不弄明白不甘心
这样一来hWnd都无效了
HDESK hdesk;
HWINSTA hwinstaCurrent;
HWINSTA hwinsta; hwinstaCurrent = GetProcessWindowStation();
if (hwinstaCurrent == NULL)
{
return FALSE;
} hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
if (hdeskCurrent == NULL)
{
return FALSE;
}//打开winsta0
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;
} if (!SetProcessWindowStation(hwinsta))
{
return FALSE;
}//打开desktop
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;
} SetThreadDesktop(hdesk);
//到此你获得了访问用户桌面的权限,可以发消息了! if (!SetProcessWindowStation(hwinstaCurrent))
return FALSE; if (!SetThreadDesktop(hdeskCurrent))
return FALSE; if (!CloseWindowStation(hwinsta))
return FALSE; if (!CloseDesktop(hdesk))
return FALSE;
而且访问System的WinStation,普通用户进程没有权限,该如何处理?
{
HDESK old_desktop = GetThreadDesktop(GetCurrentThreadId()); // Switch into the Winlogon desktop
if (!vncService::SelectDesktop("Winlogon"))
{
vnclog.Print(LL_INTERR, VNCLOG("failed to select logon desktop\n"));
return FALSE;
} vnclog.Print(LL_ALL, VNCLOG("generating ctrl-alt-del\n")); // Fake a hotkey event to any windows we find there.... :(
// Winlogon uses hotkeys to trap Ctrl-Alt-Del...
PostMessage(HWND_BROADCAST, WM_HOTKEY, 0, MAKELONG(MOD_ALT | MOD_CONTROL, VK_DELETE)); // Switch back to our original desktop
if (old_desktop != NULL)
vncService::SelectHDESK(old_desktop); return NULL;
}