我有两个程序,一个是服务程序,一个是用户程序
按照我现在的了解,服务程序在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);
}
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条都已经实现了,但还是不行
交互服务必须运行在 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条都已经实现了,但还是不行
交互服务必须运行在 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 都可以实现通信