以前在csdn上看见一位仁兄写的文章,类似于更换桌面(不是更换桌面墙纸),但运行的程序仍然进程里,以前把那个代码研究了一下,可惜硬盘出了一些问题,所以代码不见了,所以……希望大家帮忙

解决方案 »

  1.   

    我记得以前那位仁兄写的文章有“吐血推荐”这几个字,但是我在csdn上搜索了很久也没找到,所以才发了这个……
    UP者有分!!!!!!!!
    提供代码者高分!!!!!!!
    谢谢!!!!!
      

  2.   

    那个代码我就不知道了,不过帮人顶一下。
    其实你用注入一个dll到目标进程的方法也可以实现的
      

  3.   

    #include "stdafx.h"
    #include "resource.h"#include "ShellApi.h"HINSTANCE hInst = NULL;HDESK hDesktopCurrent = NULL;
    HDESK hDesktopLlx = NULL;LONG APIENTRY WndProc(
        HWND hWnd,
        UINT message,      // type of message
        WPARAM wParam,     // additional information
        LPARAM lParam)     // additional information
    {
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc; switch (message) 
    {
    case WM_COMMAND:
    wmId    = LOWORD(wParam); 
    wmEvent = HIWORD(wParam); 
    // Parse the menu selections:
    switch (wmId)
    {
    case IDM_ABOUT:
       //DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
       break;
    case IDM_EXIT:
       DestroyWindow(hWnd);
       break;
    default:
       return DefWindowProc(hWnd, message, wParam, lParam);
    }
    break;
    case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    // TODO: Add any drawing code here...
    RECT rt;
    GetClientRect(hWnd, &rt);
    //DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
    EndPaint(hWnd, &ps);
    break;
    /*
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    //*/
    case WM_LBUTTONDOWN:
    break;
    case WM_HOTKEY:
    if(7777 == wParam)
    {
    PostQuitMessage(0);
    }
    else if(7778 == wParam)
    {
    SwitchDesktop(hDesktopCurrent);
    }
    else if(7779 == wParam)
    {
    SwitchDesktop(hDesktopLlx);
    }
    break;
    case WM_QUIT:
    case WM_DESTROY:
    SwitchDesktop(hDesktopCurrent);
    return DefWindowProc(hWnd, message, wParam, lParam);
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
       }
       return 0;
    }void StartMyExplore(void)
    {
    STARTUPINFO sui;         // Process startup info
    PROCESS_INFORMATION pi;  // info returned from CreateProcess
    //
    // Most sui members will be 0
    //
    ZeroMemory ((PVOID)&sui, sizeof(sui)); sui.cb = sizeof (sui);
    //
    // Need the lpDesktop member so the new process runs on this desktop
    // The lpDesktop member was reserved in previous versions of NT
    //
    sui.lpDesktop = _T("llx");
    CreateProcess (NULL,   // image name
    "explorer", // command line
    NULL,   // process security attributes
    NULL,   // thread security attributes
    TRUE,   // inherit handles
    CREATE_DEFAULT_ERROR_MODE|CREATE_SEPARATE_WOW_VDM,
    NULL,   // environment block
    NULL,   // current directory
    &sui,   // STARTUPINFO
    &pi);   // PROCESS_INFORMATION
    }int CALLBACK WinMain( HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
    {
    //  run once
    SECURITY_ATTRIBUTES sa;
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle = TRUE;
    sa.lpSecurityDescriptor = 0;
    HANDLE hMap = NULL;
    hMap = CreateFileMapping((void *)0xFFFFFFFF, &sa, PAGE_READWRITE, 0, 8, "File_llx");
    if (hMap != NULL && GetLastError() == ERROR_ALREADY_EXISTS) 

    return TRUE;
    }  WNDCLASS wc;
    wc.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon (NULL, "IDI_SETTHREADDESKTOP");
    wc.hCursor = LoadCursor (NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "lilinxiang";
    if(!RegisterClass(&wc))
    {
    return TRUE;
    } hDesktopCurrent = NULL;
    hDesktopCurrent = GetThreadDesktop(GetCurrentThreadId()); hDesktopLlx = NULL;
    hDesktopLlx = OpenDesktop("llx", 0, FALSE, NULL);
        if (hDesktopLlx != NULL)
    {
    CloseDesktop(hDesktopLlx);
    } hDesktopLlx = CreateDesktop("llx", NULL,
                                        NULL,0,MAXIMUM_ALLOWED,
                                        NULL);
    if(hDesktopLlx == NULL)
    {
    return 0;
    } if(!SetThreadDesktop(hDesktopLlx))
    {
    char szError[256] = {0};
    ltoa( (long)(GetLastError()) , szError, 10);
    }
    SwitchDesktop(hDesktopLlx); HWND hWnd = NULL;
    hWnd = CreateWindow ("lilinxiang",
    "hello, world!",
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, 
    0, 
    CW_USEDEFAULT, 
    0, 
    NULL, 
    NULL, 
    hInstance, 
    NULL
    );
    if(NULL == hWnd)
    {
    return TRUE;
    } //register hotkey for exit this desktop or switch to another desktop
    //ShowWindow(hWnd, SW_SHOW);
    //UpdateWindow(hWnd);
    if(!RegisterHotKey(hWnd, 7777, MOD_CONTROL, 'Q'))
    {//exit process
    return TRUE;
    }
    if(!RegisterHotKey(hWnd, 7778, MOD_CONTROL | MOD_SHIFT, 'Q'))
    {//switch to new desktop
    return TRUE;
    }
    if(!RegisterHotKey(hWnd, 7779, MOD_CONTROL | MOD_SHIFT, 'W'))
    {//switch to original desktop
    return TRUE;
    }

    StartMyExplore(); MSG msg;
    while (GetMessage(&msg, NULL,  0, 0))
        {
                     TranslateMessage(&msg);// Translates virtual key codes
                     DispatchMessage(&msg); // Dispatches message to window
        } SwitchDesktop(hDesktopCurrent);
    return TRUE;
    }
      

  4.   

    呵呵!谢谢loopyifly(深情咸鱼)和Ah(蓝过天)了!