下面是一个将环境变量放在列表框中,点击其中某个条目时,就会在一个静态文本中显示该环境变量的值,如图:
环境变量吧,可以通过GetEnvironmentString函数获取,不过需要注意,windows的环境变量是存放在一个字符数组中,该函数返回指向该数组的第一个字符的指针
而且数组开头有一个特殊标志,会看到是这样的:"=::=::\\"
每个环境变量都是以”变量名=变量值”存放,所以数组中的内容是这样的:
"=::=::\\ 变量1=变量值1 变量2=变量值2 ..."
这里看到的是空格,其实是字符串结束标志’\0’,所以要输出环境变量需要跳过’\0’和”=::=::\”
下面就是一个简单的列表框小程序了
//不知道为什么同样的代码在vc可以运行而vs2013就不可与,郁闷!!???
# include<windows.h>
# define ID_LIST 1
# define ID_TEXT 2
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR lpCmdLine,
int iCmdShow)
{
static TCHAR szAppName[] = TEXT("那又怎样");
WNDCLASS wndclass;
HWND hwnd;
MSG msg;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);//这里用NULL表示使用微软提供的图标
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //同上
wndclass.hInstance = hInstance;
wndclass.lpfnWndProc = WndProc;
wndclass.lpszClassName = szAppName;
wndclass.lpszMenuName = NULL;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
if (!RegisterClass(&wndclass))//注册窗口类
{
MessageBox(NULL, TEXT("Program requires windows NT!"), szAppName, MB_ICONERROR);
return 0;
}
hwnd = CreateWindow(szAppName, TEXT("Environment List Box"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,
NULL,NULL, hInstance, NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
void FillListBox(HWND hwndList)
{
int iLength;
TCHAR *pVarBlock, *pVarBeg, *pVarEnd, *pVarName,*p;
pVarBlock = GetEnvironmentStrings();//Get pointer to environment block
//环境变量是保存在一个字符数组里,开头有一个特殊标记,可以试一下,是字符串"=::=::\\"
//然后每隔一个环境变量后面都会有一个字符串结束标志(‘\0’),所以要绕过第一次的"=::=::\\"
//和'\0'
p = pVarBlock;//保存该指针,以后要释放
while (*pVarBlock)
{
if (*pVarBlock != '=')//Skip variable names beginning with '='
{
pVarBeg = pVarBlock; //Begining of variable name
while (*pVarBlock++ != '=');//Scan until '='
pVarEnd = pVarBlock-1;//points to '='sign
iLength = pVarEnd - pVarBeg;//Length of variable name
//Allocate memory for the variable name and terminating zero.
//Copy the variable name and append a zero
pVarName =new TCHAR[iLength+1];
CopyMemory(pVarName, pVarBeg, iLength*sizeof(TCHAR));
pVarName[iLength] = '\0';
//Put the variable name in the list box and free menory
SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)pVarName);
delete []pVarName;
}
//当pVarBlock指向‘\0’时结束循环,pVarBlock++,就指向了下一个环境变量字符串
while (*pVarBlock++ != '\0');
//Scan until terminating zero
}
FreeEnvironmentStrings(p);
}
LRESULT CALLBACK WndProc(HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
static HWND hwndList, hwndText;
int ilndex, iLength, cxChar, cyChar;
TCHAR *pVarName, *pVarValue;
switch (uMsg)
{
case WM_CREATE:
cxChar = LOWORD(GetDialogBaseUnits());
cyChar = HIWORD(GetDialogBaseUnits());
//Create listbox and static text windows
hwndList = CreateWindow(TEXT("listbox"), NULL,
WS_CHILD | WS_VISIBLE | LBS_STANDARD,
cxChar, cyChar * 3, cxChar * 16 + GetSystemMetrics(SM_CXVSCROLL), cyChar * 5,
hwnd, (HMENU)ID_LIST,
//这两种方法都可以获取父窗口的实例句柄,或者将其定义为全局变量
//(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
((LPCREATESTRUCT)lParam)->hInstance,
NULL);
//静态文本
hwndText = CreateWindow(TEXT("static"), NULL, WS_CHILD | WS_VISIBLE | SS_LEFT,
cxChar, cyChar,
GetSystemMetrics(SM_CXSCREEN), cyChar, hwnd, (HMENU)ID_TEXT,
(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
FillListBox(hwndList);
return 0;
case WM_SETFOCUS:
SetFocus(hwndList);
return 0;
case WM_COMMAND:
if (LOWORD(wParam) == ID_LIST&&HIWORD(wParam) == LBN_SELCHANGE)
{
//Get currient selection
ilndex = SendMessage(hwndList, LB_GETCURSEL, 0, 0);
iLength = SendMessage(hwndList, LB_GETTEXTLEN, ilndex, 0) + 1;
pVarName =new TCHAR[iLength];
SendMessage(hwndList, LB_GETTEXT, ilndex, (LPARAM)pVarName);
//Get environment string
iLength = GetEnvironmentVariable(pVarName, NULL, 0);
pVarValue = new TCHAR[iLength];;
GetEnvironmentVariable(pVarName, pVarValue, iLength);
//Show it in window
SetWindowText(hwndText, pVarValue);
delete[]pVarName;
delete[]pVarValue;
}
return 0;
case WM_CLOSE:
PostQuitMessage(0);
//DestroyWindow(hwnd);
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}