C#中Dispose和Close的和得的区别别

C++实现虚拟桌面
虚拟一个桌面,然后在虚拟桌面启动explorer进程,用户可以用"ALT+Q"来切换现有桌面与这个虚拟桌面,用户须要运行什么软件,自己在虚拟桌面打开就是了。
hI&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//当前实例
TCHAR szAppName[] = TEXT ("VirtualDesk")
//程序名称
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//主窗体句柄
hVirtualD&&&&&&&&&&&&
& & //虚拟桌面句柄
hC&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//当前桌面句柄
PROCESS_INFORMATION
piE&&&&&&&&&&&&&&&&&&
//Explorer进程的PROCESS_INFORMATION结构
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
//每次运行首先检测注册表相关项,如果未发现,则设置开机自动运行
void SetStartup(HINSTANCE hInst)
DataType = REG_SZ;
data_run =
"Software\\Microsoft\\Windows\\CurrentVersion\\Run";
&&& long ret =
RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_run,0,KEY_ALL_ACCESS,&hKey);
&&& if (ret !=
ERROR_SUCCESS)
MessageBox(NULL,"无法打开注册表键","Error",0);
&&& CString
&&& int len =
GetModuleFileName(hInst,ProcessName.GetBuffer(256),256);
&&& if (len ==
MessageBox(NULL,"无法获取进程的当前目录","Error",0);
ProcessName.ReleaseBuffer(len);
direcLen = ProcessName.GetLength() + 1;
&&& LPBYTE direc
= new BYTE[direcLen];
ZeroMemory(direc,direcLen);
RegQueryValueEx(hKey,"VirtualDesk",0,0,direc,&direcLen);
//如果键不存在或者键长度与目前的值长度不匹配则添加新键
&&& if ((ret !=
ERROR_SUCCESS )|| (direcLen != ProcessName.GetLength()+1))
DWORD KeyLength = ProcessName.GetLength() + 1;
LPBYTE KeyValue = new BYTE[KeyLength];
ZeroMemory(KeyValue,KeyLength);
for (int i=0;i
&&&&&&&&&&&
KeyValue[i] = ProcessName[i];
KeyValue[ProcessName.GetLength()] = 0;
RegSetValueEx(hKey,"VirtualDesk",0,REG_SZ,KeyValue,KeyLength);
delete []KeyV
//如果键的内容与当前值不匹配同样进行更改
for (int i=0;i
&&&&&&&&&&&
if (direc[i] != ProcessName[i])
&&&&&&&&&&&&&&&
&&& delete
//创建explorer进程的函数,如果创建了一个虚拟桌面,那么最好调用该函数
void StartExplorer()
&&& STARTUPINFO
&&& ZeroMemory(
&si, sizeof(si) );
&&& si.cb =
sizeof(si);
&&& si.lpDesktop
= "Virtual";
&&& ZeroMemory(
&piExplor, sizeof(piExplor) );
!CreateProcess(
NULL,&&&&&&&&&&&&&&&&&&
// No module name (use command line).
&&&&&&&&&&&&&&&&&&&&&&&&
"explorer",&&&&&&&&&&&&
// Command line.
&&&&&&&&&&&&&&&&&&&&&&&&
NULL,&&&&&&&&&&&&&&&&&&
// Process handle not inheritable.
&&&&&&&&&&&&&&&&&&&&&&&&
NULL,&&&&&&&&&&&&&&&&&&
// Thread handle not inheritable.
&&&&&&&&&&&&&&&&&&&&&&&&
FALSE,&&&&&&&&&&&&&&&&&
// Set handle inheritance to FALSE.
&&&&&&&&&&&&&&&&&&&&&&&&
0,&&&&&&&&&&&&&&&&&&&&&
// No creation flags.
&&&&&&&&&&&&&&&&&&&&&&&&
NULL,&&&&&&&&&&&&&&&&&&
// Use parent's environment block.
&&&&&&&&&&&&&&&&&&&&&&&&
NULL,&&&&&&&&&&&&&&&&&&
// Use parent's starting directory.
&&&&&&&&&&&&&&&&&&&&&&&&
&si,&&&&&&&&&&&&&&&&&&&
// Pointer to STARTUPINFO structure.
&&&&&&&&&&&&&&&&&&&&&&&&
)&&&&&&&&&&&&
// Pointer to PROCESS_INFORMATION structure.
MessageBox(NULL,"无法初始化Explorer","Error",0);
ExitProcess(1);
ATOM MyRegisterClass(HINSTANCE hInstance)
&&& WNDCLASSEX
&&& wcex.cbSize
= sizeof(WNDCLASSEX);
wcex.style&&&&&&&&&
= CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc&&&
= (WNDPROC)WndP
wcex.cbClsExtra&&&&
wcex.cbWndExtra&&&&
wcex.hInstance&&&&&
wcex.hIcon&&&&&&&&&
= LoadIcon(hInstance, (LPCTSTR)IDI_APPLICATION);
wcex.hCursor&&&&&&&
= LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName&& = NULL;
wcex.lpszClassName = szAppN
wcex.hIconSm&&&&&&&
= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_APPLICATION);
&&& return
RegisterClassEx(&wcex);
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
&&& hInst =
hI // 将实例句柄存储在全局变量中
&&& hwnd =
CreateWindow(szAppName, TEXT ("SunBear"),
WS_OVERLAPPEDWINDOW,
&&&&&&&&&&&&&&&&&&&&&&&
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInst, NULL);
return FALSE;
&&& return
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE
hPrevInstance,PSTR szCmdLine, int iCmdShow)
&&& static TCHAR
szAppName[] = TEXT ("SunBear") ;
MSG&&&&&&&&&
SetStartup(hInstance);
&&& hVirtualDesk
= CreateDesktop(
&&&&&&&&&&&&&&&&&&&&&&
"Virtual",
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
DF_ALLOWOTHERACCOUNTHOOK,
&&&&&&&&&&&&&&&&&&&&&&
GENERIC_ALL,
&&&&&&&&&&&&&&&&&&&&&&
&&& hCurrent =
GetThreadDesktop(GetCurrentThreadId());
MyRegisterClass(hInstance);
(!InitInstance (hInstance, iCmdShow))
return FALSE;
StartExplorer();&&&&&&&&&&&
//启动Explorer进程
(!RegisterHotKey(hwnd, 0x0001,MOD_ALT ,'Q'))
//处理切换虚拟桌面
return TRUE;
(!RegisterHotKey(hwnd, 0x0002, 0,VK_F8))
//处理退出进程
return TRUE;
(GetMessage (&msg, NULL, 0, 0))
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
&&& return
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,
LPARAM lParam)
HDC&&&&&&&&
&&& PAINTSTRUCT
&&& static HDESK
&&& switch
hdc = BeginPaint (hwnd, &ps) ;
EndPaint (hwnd, &ps) ;
return 0 ;
WM_DESTROY:
//在关闭虚拟桌面前要切换回当前桌面
SwitchDesktop(hCurrent);
PostQuitMessage (0) ;
return 0 ;
WM_HOTKEY:
if (0x0001 == wParam)
&&&&&&&&&&&
if (hNow == hCurrent)
&&&&&&&&&&&
&&&&&&&&&&&&&&&
SwitchDesktop(hVirtualDesk);
&&&&&&&&&&&&&&&
hNow = hVirtualD
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&&&&&
SwitchDesktop(hCurrent);
&&&&&&&&&&&&&&&
&&&&&&&&&&&
if (0x0002 == wParam)
&&&&&&&&&&&
//用TerminateProcess终止explorer进程的时候,如果传递第二个参数为1
&&&&&&&&&&&
//那么操作系统不会在终止后自动唤醒explorer,如果为0,会重新启动
&&&&&&&&&&&
//explorer
&&&&&&&&&&&
TerminateProcess(piExplor.hProcess,1);
&&&&&&&&&&&
//关闭虚拟桌面
&&&&&&&&&&&
CloseDesktop(hVirtualDesk);
&&&&&&&&&&&
SendMessage(hwnd,WM_CLOSE,0,0);
&&& return
DefWindowProc (hwnd, message, wParam, lParam) ;
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。在MFC中怎样刷新桌面窗口
在MFC中怎样刷新桌面窗口
我在MFC单文档程序中利用CWindowDC dcc(GetDesktopWindow())在桌面显示了一张图片,并让他移动!但是移动的时候有严重的残留痕迹~
& 请教高手怎样才能消除痕迹呢?还有就是怎样才能让画在桌面上的图片随着我的窗口的移动而移动?我是菜鸟
昵称: fg607 &时间:
昵称: kyotrue &时间:
昵称: gordon3000 &时间:
昵称: wei &时间:
昵称: fangongdalu7148 &时间:
麻烦说具体一点,我是菜鸟,刚学MFC不是很懂,有代码最好!
昵称: fg607 &时间:
昵称: haogeai123 &时间:
的确和F5效果一样,但是这不是我的初衷啊,这个闪的太厉害了,而且程序窗口也卡的很!希望大侠给出解决方法,不过这个函数很厉害!收藏了!
昵称: fg607 &时间:
你这个函数好像不行吧!
昵称: fg607 &时间:}

我要回帖

更多关于 的和得的区别 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信