急!我想在服务程序中使用findwindow(也就是 session0 与session1)进行通讯,如何实现

纯净水o 2018-03-13 04:17:11
我的需求是这样的
我有两个程序,一个是服务程序,一个是用户程序
按照我现在的了解,服务程序在session0层用户程序在session1层
在正常情况下服务程序中使用findwindow和sendmessage是无效的。
我现在想要实现的就是在服务程序中给用户程序发送消息

下面是我在网上找的代码,原理是修改窗口站,便可以使服务程序给窗口程序发送消息,经过测试
服务程序在非服务状态时运行该代码可以有效的与用户程序通讯,一旦设置为服务程序,也就无效了,
并且设置“允许服务与桌面交互“ 也不好使

还请各位大神帮帮忙解决一下,卡在这里2天了


void Run()
{
HWND hWndQQ = NULL;
HWINSTA hstaSave;
LPCWSTR lpStation = L"WinSta0";
LPCWSTR lpDesk = L"default";
HWINSTA hstaUser;

HDESK hdeskSave;
HDESK hdeskUser;

hstaSave = GetProcessWindowStation();

hstaUser = OpenWindowStation(lpStation, 0, WINSTA_ALL_ACCESS);

SetProcessWindowStation(hstaUser);

hdeskSave = GetThreadDesktop(GetCurrentThreadId());

hdeskUser = OpenDesktop(lpDesk, 0, FALSE, DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | DESKTOP_ENUMERATE | DESKTOP_HOOKCONTROL | DESKTOP_JOURNALPLAYBACK | DESKTOP_JOURNALRECORD | DESKTOP_READOBJECTS | DESKTOP_SWITCHDESKTOP | DESKTOP_WRITEOBJECTS);
if (hdeskUser == NULL)
{
OutputDebugStringA("@xiaohuihui:Open desktop Failed!");

}
if (SetThreadDesktop(hdeskUser) == NULL)
{
OutputDebugStringA("@xiaohuihui:SetThreadDesktop Failed!");
}

////////////////////////这里添加与窗口交互的代码///////////////////////////
hWndQQ = FindWindow(NULL, L"DiscernPicture");
if (hWndQQ != NULL)
{
OutputDebugStringA("@xiaohuihui:Find Window Success!");
}
else
{
OutputDebugStringA("@xiaohuihui:Find Window Falied!");
}

SetThreadDesktop(hdeskSave);
SetProcessWindowStation(hstaSave);
CloseDesktop(hdeskUser);
CloseWindowStation(hstaUser);
}

...全文
1038 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2018-03-14
  • 打赏
  • 举报
回复
共享内存、管道、dcom、sock 都可以实现通信
Eleven 2018-03-13
  • 打赏
  • 举报
回复
用管道吧,简单好用~
纯净水o 2018-03-13
  • 打赏
  • 举报
回复
搜索过了 ,但都不能满足我的需求,目前进展是 交互服务必须运行在 LocalSystem 帐户的上下文中,进行配置后以交互方式运行。 在调用CreateService函数时指定dwServeceType参数为SERVICE_INTERACTIVE_PROCESS旗标,服务就能够被配置为以交互的方式运行。 但是,下面的注册表项包含一个的值NoInteractiveServices,用于控制该 SERVICE_INTERACTIVE_PROCESS 标志的影响: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows NoInteractiveServices的默认值为0,意味着有SERVICE_INTERACTIVE_PROCESS标志的服务能以交互的方式运行。当 NoInteractiveServices 值设置为非零值时,在那之后启动的服务,无论它是否设置了SERVICE_INTERACTIVE_PROCESS,都不能以交互都方式运行; 以上3条都已经实现了,但还是不行
赵4老师 2018-03-13
  • 打赏
  • 举报
回复
百度搜“Session0穿透”?

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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