求助:几个简单问题 1、如何才能让我的程序只运行一个实例,不使用全局变量?2、如何使我的程序窗口不能被其他窗口覆盖?(好象使用什么函数吧)3、如何使我的程序不在任务栏上出现,不在任务管理器中出现?如果分数不够,还可以再加 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1.使用具名的内核对象.如HANDLE hMap=static_cast<HANDLE>(CreateFileMapping((HANDLE)0xFFFFFFFF, NULL,PAGE_READWRITE, 0, 128, "MutexRunning")); if(hMap==NULL) // 如果创建失败 { AfxMessageBox("创建用于互斥运行的内存映射文件对象失败!", MB_OK|MB_ICONSTOP); return FALSE; }else if(GetLastError()==ERROR_ALREADY_EXISTS) { SAFE_CLOSE_HANDLE(hMap); HWND hwnd = FindWindow(TEXT("#32770"),TEXT("Your window's title")); if(IsWindow(hwnd)) { SetForegroundWindow(hwnd); } return FALSE; } 2.BOOL SetWindowPos( HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags ); ::SetWindowPos(GetSafeHwnd(),HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); 1.HANDLE m_hMutex = ::HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCTSTR lpName ); if (GetLastError() == ERROR_ALREADY_EXISTS) { AfxMessageBox("my project already run!"); CloseHandle(m_hMutex); return FALSE; } 1.我只知道用FindWindow.2.我记得好像是::SetWindowPos(GetSafeHwnd(),HWND_TOPMOST,-1,-1,-1,-1,SWP_NOSIZE|SWP_NOMOVE);3.如果不在“应用程序”里面出现的话,不显示窗口就可以。但是如果想不在进程里面出现的话,好像必须注册成为服务进程 1 初始化函数里创建互斥量,判断返回值BOOL CYourApp::InitInstance(){ HANDLE Handle; Handle = CreateMutex(NULL,FALSE,_T("MakeSheet3.0")); if(Handle==NULL) return FALSE; if(GetLastError() == ERROR_ALREADY_EXISTS) { AfxMessageBox("MakeSheet3.0已运行!",MB_ICONSTOP); return FALSE; } ........}2使窗口始终在最前方?两种途径.BringWindowToTop(Handle);SetWindowPos函数,指定窗口的最顶风格,用WS_EX_TOPMOST扩展窗口的 风格Example:void ToggleTopMost( CWnd *pWnd){ASSERT_VALID(pWnd);pWnd ->SetWindowPos(pWnd-> GetStyle() &WS_EX_TOPMOST)?&wndNoTopMOST: &wndTopMost,0,0,0,0,SSP_NOSIZE|WSP_NOMOVE};}3隐藏的效果如果只是要在任务管理器的应用程序列表里隐藏,可以看以前的很多讨论,不是很难,如果要在进程列表里隐藏可能比较麻烦,看看一些黑客工具方法 1,用互斥很简单,CreateMutex(NULL,FALSE,_T("your app name"));2,SetWindowPos 3.进程隐藏技术在Win9X系统下可以通过调用RegisterServiceProcess API这个API函数将进程注册为一个服务模式的进程,这样在Win9X系统下用Ctrl+Alt+Del调出的任务管理器中将不会出现这个进程了.但是要在WinNT系统下真正的实现进程隐藏就没有在Win9X系统下那么简单了.只要进程以进程内核的形式运行,进程就将出现在任务管理器中.要实现WinNT下进程的真正隐藏,只能以非进程的方式执行目标代码,也就是说把目标代码以线程的方式远程注册到宿主进程中. 嗯,同意 skyonline(山中过客)说的你需要注入远程宿主进程,然后开线程启动你的进程 1.CreateMutex()2.SetWindowPos()3.SetWindowLong() 如何改变一个对话框中只读CEdit的背景颜色 mfc中怎样实现暂停? 连接查询 第一次写诗,就算是诗吧! 请问如何调用COM DLL的标准接口函数“DllRegisterServer”? _RecordsetPtr 对象的getcollect()方法 哪有《Windows 核心编程》源代码下载?要好用的,我下了一个,不好用。 .Net一说 卖书! MFC方面,以后如何发展 求助!不能确定是否已经完全删除 mcisendstring的奇怪问题
HANDLE hMap=static_cast<HANDLE>(CreateFileMapping((HANDLE)0xFFFFFFFF, NULL,PAGE_READWRITE, 0, 128, "MutexRunning")); if(hMap==NULL) // 如果创建失败
{
AfxMessageBox("创建用于互斥运行的内存映射文件对象失败!", MB_OK|MB_ICONSTOP);
return FALSE;
}
else if(GetLastError()==ERROR_ALREADY_EXISTS)
{
SAFE_CLOSE_HANDLE(hMap);
HWND hwnd = FindWindow(TEXT("#32770"),TEXT("Your window's title"));
if(IsWindow(hwnd))
{
SetForegroundWindow(hwnd);
}
return FALSE;
}
BOOL SetWindowPos(
HWND hWnd,
HWND hWndInsertAfter,
int X,
int Y,
int cx,
int cy,
UINT uFlags
); ::SetWindowPos(GetSafeHwnd(),HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
LPSECURITY_ATTRIBUTES lpMutexAttributes,
BOOL bInitialOwner,
LPCTSTR lpName );
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
AfxMessageBox("my project already run!");
CloseHandle(m_hMutex);
return FALSE;
}
::SetWindowPos(GetSafeHwnd(),HWND_TOPMOST,-1,-1,-1,-1,SWP_NOSIZE|SWP_NOMOVE);3.如果不在“应用程序”里面出现的话,不显示窗口就可以。
但是如果想不在进程里面出现的话,好像必须注册成为服务进程
初始化函数里创建互斥量,判断返回值
BOOL CYourApp::InitInstance()
{
HANDLE Handle;
Handle = CreateMutex(NULL,FALSE,_T("MakeSheet3.0"));
if(Handle==NULL)
return FALSE;
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
AfxMessageBox("MakeSheet3.0已运行!",MB_ICONSTOP);
return FALSE;
}
........
}2
使窗口始终在最前方?
两种途径.
BringWindowToTop(Handle);
SetWindowPos函数,指定窗口的最顶风格,用WS_EX_TOPMOST扩展窗口的 风格
Example:
void ToggleTopMost( CWnd *pWnd)
{
ASSERT_VALID(pWnd);
pWnd ->SetWindowPos(pWnd-> GetStyle() &WS_EX_TOPMOST)?
&wndNoTopMOST: &wndTopMost,0,0,0,0,SSP_NOSIZE|WSP_NOMOVE};
}3
隐藏的效果如果只是要在任务管理器的应用程序列表里隐藏,可以看以前的很多讨论,不是很难,如果要在进程列表里隐藏可能比较麻烦,看看一些黑客工具方法
2,SetWindowPos
在Win9X系统下可以通过调用RegisterServiceProcess API这个API函数将进程注册为一个服务模式的进程,这样在Win9X系统下用Ctrl+Alt+Del调出的任务管理器中将不会出现这个进程了.但是要在WinNT系统下真正的实现进程隐藏就没有在Win9X系统下那么简单了.只要进程以进程内核的形式运行,进程就将出现在任务管理器中.要实现WinNT下进程的真正隐藏,只能以非进程的方式执行目标代码,也就是说把目标代码以线程的方式远程注册到宿主进程中.
你需要注入远程宿主进程,然后开线程启动你的进程
2.SetWindowPos()
3.SetWindowLong()