1、如何才能让我的程序只运行一个实例,不使用全局变量?2、如何使我的程序窗口不能被其他窗口覆盖?(好象使用什么函数吧)3、如何使我的程序不在任务栏上出现,不在任务管理器中出现?如果分数不够,还可以再加

解决方案 »

  1.   

    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.   

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

  3.   

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

  4.   

    1.我只知道用FindWindow.2.我记得好像是
    ::SetWindowPos(GetSafeHwnd(),HWND_TOPMOST,-1,-1,-1,-1,SWP_NOSIZE|SWP_NOMOVE);3.如果不在“应用程序”里面出现的话,不显示窗口就可以。
    但是如果想不在进程里面出现的话,好像必须注册成为服务进程
      

  5.   

    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
    隐藏的效果如果只是要在任务管理器的应用程序列表里隐藏,可以看以前的很多讨论,不是很难,如果要在进程列表里隐藏可能比较麻烦,看看一些黑客工具方法
      

  6.   

    1,用互斥很简单,CreateMutex(NULL,FALSE,_T("your app name"));
    2,SetWindowPos
      

  7.   

    3.进程隐藏技术
    在Win9X系统下可以通过调用RegisterServiceProcess API这个API函数将进程注册为一个服务模式的进程,这样在Win9X系统下用Ctrl+Alt+Del调出的任务管理器中将不会出现这个进程了.但是要在WinNT系统下真正的实现进程隐藏就没有在Win9X系统下那么简单了.只要进程以进程内核的形式运行,进程就将出现在任务管理器中.要实现WinNT下进程的真正隐藏,只能以非进程的方式执行目标代码,也就是说把目标代码以线程的方式远程注册到宿主进程中.
      

  8.   

    嗯,同意 skyonline(山中过客)说的
    你需要注入远程宿主进程,然后开线程启动你的进程
      

  9.   

    1.CreateMutex()
    2.SetWindowPos()
    3.SetWindowLong()