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

时间:2021-12-13 08:52:50
我的需求是这样的
我有两个程序,一个是服务程序,一个是用户程序
按照我现在的了解,服务程序在session0层用户程序在session1层
在正常情况下服务程序中使用findwindow和sendmessage是无效的。
我现在想要实现的就是在服务程序中给用户程序发送消息

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

还请各位大神帮帮忙解决一下,卡在这里2天了 
急!我想在服务程序中使用findwindow(也就是 session0 与session1)进行通讯,如何实现

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);
}

4 个解决方案

#1


百度搜“Session0穿透”?

#2


搜索过了 ,但都不能满足我的需求,目前进展是
交互服务必须运行在 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条都已经实现了,但还是不行

#3


用管道吧,简单好用~

#4


共享内存、管道、dcom、sock 都可以实现通信

#1


百度搜“Session0穿透”?

#2


搜索过了 ,但都不能满足我的需求,目前进展是
交互服务必须运行在 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条都已经实现了,但还是不行

#3


用管道吧,简单好用~

#4


共享内存、管道、dcom、sock 都可以实现通信