在线程中如和创建和显示一个窗口 用的 请教各位高手哪个应该怎样做
//Socket线程,负责接收数据
DWORD WINAPI CAVIOMgr::SockThreadProc(LPVOID lpParameter)
{
CAVIOMgr* pMgr=(CAVIOMgr*)lpParameter;
/////////////////////////////pMgr->m_Socketcp.Listen();
SOCKET TEMPSOCKET=NULL;
int i ;
i=sizeof(struct sockaddr_in);
sockaddr_in addr;
DWORD ThreadId;
TEMPSOCKET=accept(pMgr->m_Socketcp.serv, (sockaddr*)&addr, &i);//gjl200
CreateThread(0,0,SockThreadProc,(LPVOID)lpParameter,0,&ThreadId);
if (TEMPSOCKET!=INVALID_SOCKET )
{
pMgr->m_Socketcp.CLINET_SOCK[socknum]=TEMPSOCKET;
//if(socknum < 4)
//{
//CVideoWnd *ss = new CVideoWnd;
//m_remownd[socknum]=ss;
m_remownd[socknum].Create(IDD_VIDEO,pMgr->m_hwndMainWnd, FALSE);
m_remownd[socknum].m_vs.remsock=TEMPSOCKET;
ShowWindow(m_remownd[socknum],SW_SHOW);
ShowWindow(m_remownd[socknum].m_vs,SW_SHOW);
//SetWindowPos(m_remownd[socknum].GetHwnd(),100,122+20,100,0,0,SWP_NOSIZE);
// }
}
//Socket线程,负责接收数据
DWORD WINAPI CAVIOMgr::SockThreadProc(LPVOID lpParameter)
{
CAVIOMgr* pMgr=(CAVIOMgr*)lpParameter;
/////////////////////////////pMgr->m_Socketcp.Listen();
SOCKET TEMPSOCKET=NULL;
int i ;
i=sizeof(struct sockaddr_in);
sockaddr_in addr;
DWORD ThreadId;
TEMPSOCKET=accept(pMgr->m_Socketcp.serv, (sockaddr*)&addr, &i);//gjl200
CreateThread(0,0,SockThreadProc,(LPVOID)lpParameter,0,&ThreadId);
if (TEMPSOCKET!=INVALID_SOCKET )
{
pMgr->m_Socketcp.CLINET_SOCK[socknum]=TEMPSOCKET;
//if(socknum < 4)
//{
//CVideoWnd *ss = new CVideoWnd;
//m_remownd[socknum]=ss;
m_remownd[socknum].Create(IDD_VIDEO,pMgr->m_hwndMainWnd, FALSE);
m_remownd[socknum].m_vs.remsock=TEMPSOCKET;
ShowWindow(m_remownd[socknum],SW_SHOW);
ShowWindow(m_remownd[socknum].m_vs,SW_SHOW);
//SetWindowPos(m_remownd[socknum].GetHwnd(),100,122+20,100,0,0,SWP_NOSIZE);
// }
}
解决方案 »
- 怎么讲大图片压缩成小图片
- 类内静态函数 CMyCOMMDlg::WriteThreadFunc 使用静态变量问题
- 请教!!!在c++中使用bcp语句导出表数据的问题!
- 如何实现客户区显示内容自动滚动
- #define BEGIN_MESSAGE_MAP(theClass, baseClass) \
- 请诸位大虾介绍几个好的电脑书籍下载的网址!
- 在共享DLL中使用MFC 的小问题
- 0x00EB18E0 处有未经处理的异常(在 EngineW32.exe 中): 0xC0000005: 写入位置 0x00000010 时发生访问冲突
- view的大小如何调整??
- 急问关于消息处理
- CObList 的问题
- 求VC做出OnMouseOver的效果
给你打了一段程序,又出错了,白打了简单说一下吧
在你的线程类中重载CWinThread::InitInstance()
在其中创建你的窗口
在工作者线程中是没有办法创建窗口的,除非自己写消息循环而且在线程中创建的窗口必须为顶级窗口,如果是主窗口的子窗口,会有好多的问题。
比如不能使用CWnd*来指定父窗口劝你不要找麻烦了像你这种程序可以在主线程创建窗口,然后线程中通过消息方式显示
#define WM_SYSTEMTRAY WM_USER + 1
#define WM_FRONTHASDO WM_USER + 2
#define WM_ADDTRAYICON WM_USER + 4LRESULT CALLBACK myboleProc(
HWND hwnd, // handle to window
UINT useMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch(useMsg)
{
case WM_SYSTEMTRAY:
{
switch (lParam)
{
// 双击打开前台处理程序
case WM_LBUTTONDBLCLK:
ShellExecute(NULL,"open",g_ExeFileDirectory,NULL,NULL,SW_SHOW);
break;
}
}
break; case WM_TIMER:
g_iWhichIcon = !g_iWhichIcon;
NOTIFYICONDATA nid;
nid.cbSize = sizeof( NOTIFYICONDATA );
nid.hWnd = hwnd;
nid.uID = IDI_MYICON;
nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
nid.uCallbackMessage = WM_SYSTEMTRAY;
nid.hIcon = ::LoadIcon(g_hInstance,MAKEINTRESOURCE( g_iWhichIcon ? IDI_MYICON : IDI_MYICON2) );
strcpy((nid.szTip),"ExceptionService收到故障报警。鼠标左键双击该图标进行处理");
Shell_NotifyIcon(NIM_MODIFY ,&nid);
break; // 向任务栏添加图标
case WM_ADDTRAYICON:
NOTIFYICONDATA nid2;
nid2.cbSize = sizeof( NOTIFYICONDATA );
nid2.hWnd = hTrayIconDlghWnd;
nid2.uID = IDI_MYICON;
nid2.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
nid2.uCallbackMessage = WM_SYSTEMTRAY;
nid2.hIcon = ::LoadIcon( g_hInstance,MAKEINTRESOURCE(IDI_MYICON));
strcpy(nid2.szTip,"安防报警服务程序");
Shell_NotifyIcon(NIM_ADD,&nid2);
SetTimer(hTrayIconDlghWnd,1,500,NULL);
break;
// 收到前台界面发送的消息,从任务栏删除图标
case WM_FRONTHASDO:
NOTIFYICONDATA nid1;
nid1.cbSize = sizeof( NOTIFYICONDATA );
nid1.hWnd = hwnd;
nid1.uID = IDI_MYICON;
nid1.uFlags = 0;
Shell_NotifyIcon(NIM_DELETE,&nid1);
break; default:
return DefWindowProc(hwnd,useMsg,wParam,lParam);
} return 0;
}void CreateTrayIconWindows()
{
g_hInstance = NULL;
g_hInstance = GetModuleHandle(NULL);
g_iWhichIcon = 1; if ( !hTrayIconDlghWnd )
{
WNDCLASS wndclass;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)::GetStockObject(WHITE_BRUSH);
wndclass.hCursor=NULL;
wndclass.hIcon=NULL;
wndclass.hInstance=g_hInstance ;
wndclass.lpfnWndProc=myboleProc;
wndclass.lpszClassName="myclass";
wndclass.lpszMenuName=NULL;
wndclass.style=CS_VREDRAW;
RegisterClass(&wndclass);
hTrayIconDlghWnd = CreateWindow("myclass","{370E815D-1685-4ab9-8D92-830373FEF138}static const GUID <<name>>= { 0x370e815d, 0x1685, 0x4ab9, { 0x8d, 0x92, 0x83, 0x3, 0x73, 0xfe, 0xf1, 0x38 } }",WS_OVERLAPPEDWINDOW,50,50,400,300,NULL,NULL,g_hInstance,NULL);
if(!hTrayIconDlghWnd )
{
return ;
}
}
::ShowWindow(hTrayIconDlghWnd,SW_HIDE); m_bTrayIconDlgHasCreate= true;
}// 添加任务栏图标的接收的窗口
BOOL AddTrayIconWindows()
{ HDESK hdeskCurrent;
HDESK hdesk;
HWINSTA hwinstaCurrent;
HWINSTA hwinsta; hwinstaCurrent = GetProcessWindowStation();
if (hwinstaCurrent == NULL)
{
return FALSE;
} hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
if (hdeskCurrent == NULL)
{
return FALSE;
} 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;
}
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); // 创建一个窗口
CreateTrayIconWindows() ;
if (!SetProcessWindowStation(hwinstaCurrent))
{
return FALSE;
}
if (!SetThreadDesktop(hdeskCurrent))
{
return FALSE;
}
if (!CloseWindowStation(hwinsta))
{
return FALSE;
}
if (!CloseDesktop(hdesk))
{
return FALSE;
} return true;
}在NT SERVICE的的主线程中
{
...// 创建任务栏图标的接收窗口
AddTrayIconWindows();
while (1)
{
MSG msg;
BOOL bRet;
if ( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Sleep(100); if ( !g_isRunning )
{
break;
}
}
...
}