以windows服务程序启动运行一个程序(无窗口),如何弹出窗口(如对话框)

IT_SW_FW 2011-12-02 03:43:51
DWORD dwThreadId;
//开启线程
CloseHandle(CreateThread(NULL, 0, ShowArarm, this, 0, &dwThreadId));

DWORD WINAPI ShowArarm(LPVOID lParam)
{
CUsbControl08Dlg *pDlg = (CUsbControl08Dlg *)lParam;
HDESK hdeskCurrent;
HDESK hdesk;
HWINSTA hwinstaCurrent;
HWINSTA hwinsta;

pDlg->ShowStatus(_T("Get Process Window Station"));
hwinstaCurrent = GetProcessWindowStation();
if(!hwinstaCurrent)
{
pDlg->ShowStatus(_T("get window station err"));
return 0;
}
pDlg->ShowStatus(_T("Get Thread Desktop"));
hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
if(!hdeskCurrent)
{
pDlg->ShowStatus(_T("get window desktop err"));
return 0;
}
pDlg->ShowStatus(_T("Open winsta0"));
// Open winsta0
hwinsta = OpenWindowStation(_T("winsta0"), FALSE,
WINSTA_ACCESSCLIPBOARD |
WINSTA_ACCESSGLOBALATOMS |
WINSTA_CREATEDESKTOP |
WINSTA_ENUMDESKTOPS |
WINSTA_ENUMERATE |
WINSTA_EXITWINDOWS |
WINSTA_READATTRIBUTES |
WINSTA_READSCREEN |
WINSTA_WRITEATTRIBUTES);
if(!hwinsta)
{
pDlg->ShowStatus(_T("open window station err"));
return 0;
}
pDlg->ShowStatus(_T("Set Process Window Station"));
if( !SetProcessWindowStation(hwinsta))
{
pDlg->ShowStatus(_T("Set window station err"));
return 0;
}
pDlg->ShowStatus(_T("Open default desktop"));
// Open default desktop
hdesk = OpenDesktop(_T("default"), 0, FALSE,
DESKTOP_CREATEMENU |
DESKTOP_CREATEWINDOW |
DESKTOP_ENUMERATE |
DESKTOP_HOOKCONTROL |
DESKTOP_JOURNALPLAYBACK |
DESKTOP_JOURNALRECORD |
DESKTOP_READOBJECTS |
DESKTOP_SWITCHDESKTOP |
DESKTOP_WRITEOBJECTS);
if(!hdesk)
{
pDlg->ShowStatus(_T("Open desktop err"));
return 0;
}
pDlg->ShowStatus(_T("Set Thread Desktop"));
if(!SetThreadDesktop(hdesk))
{
pDlg->ShowStatus(_T("Set desktop err"));
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
// Display the string.
//MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
pDlg->ShowStatus((LPCTSTR)lpMsgBuf);
// Free the buffer.
LocalFree( lpMsgBuf );
}

MessageBox(NULL,_T("非法操作"),_T("警告"),MB_OK|MB_SETFOREGROUND);
pDlg->ShowStatus(_T("End Box"));

if (!SetProcessWindowStation(hwinstaCurrent))
return 0;

if (!SetThreadDesktop(hdeskCurrent))
return 0;

if (!CloseWindowStation(hwinsta))
return 0;

if (!CloseDesktop(hdesk))
return 0;
pDlg->ShowStatus(_T("End Show ararm"));

return 0;
}

程序运行到MessageBox(NULL,_T("非法操作"),_T("警告"),MB_OK|MB_SETFOREGROUND);停止了,但没弹出对话框.请高手赐教
...全文
1187 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2011-12-06
  • 打赏
  • 举报
回复
服务程序不允许有界面。

开管道或者共享内存进行通信应该还是可以的。

做一个exe跟他通信就可以了。很多有服务的程序,如“小红伞”,就是开一个托盘exe,跟服务进行通信。

redui 2011-12-06
  • 打赏
  • 举报
回复
用CreateProcessAsUser启动程序一样看不到窗口,因为没有解决跨SESSION的问题。我以前回答过类似问题,但是找不到帖子了,大致原理是这样的:
1、服务程序必须设置成可与桌面交互,看看MSDN中的创建服务选项,可以找到这一项,这是能显示窗口的前提,不需要使用CreateProcessAsUser。XP及之前的版本这样做就OK了,下面的步骤针对VISTA/WIN7。
2、服务程序位于SESSION 0,桌面程序位于SESSION 1-X,通常是1,远程桌面就是其它的数了。跨SESSION的进程之间的通信方式很少,除非用SOCKET或管道,窗口就别想了,显示到另一个SESSION的桌面是不可能的。记住这点。
3、服务进程要想在桌面显示窗口,必须克隆一份自身进程的副本出来,当然是以目标SESSION身份克隆,新进程副本就位于目标SESSION中了,这个时候在副本进程里显示窗口就行了。
IT_SW_FW 2011-12-06
  • 打赏
  • 举报
回复
不能用CreateProcessAsUser启动,程序不知道用户名和密码。同时程序没有界面(即无窗口),以实现以隐藏方式运行。所以才麻烦
yuucyf 2011-12-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 oyljerry 的回复:]
Service程序在Session 0,不在当前桌面,启动的程序默认也在那个session,所以你看不到对话框
用CreateProcessAsUser启动程序,然后就可以了
[/Quote]
++
oyljerry 2011-12-03
  • 打赏
  • 举报
回复
Service程序在Session 0,不在当前桌面,启动的程序默认也在那个session,所以你看不到对话框

用CreateProcessAsUser启动程序,然后就可以了
IT_SW_FW 2011-12-02
  • 打赏
  • 举报
回复
没人解答?
IT_SW_FW 2011-12-02
  • 打赏
  • 举报
回复
弹不出对话框
liujie250079934 2011-12-02
  • 打赏
  • 举报
回复
是你点击MessageBox的确定或取消之后停止的啊 还是MessageBox没弹出来啊

15,471

社区成员

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

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