mirror of
https://github.com/reactos/reactos.git
synced 2025-08-02 05:45:50 +00:00
- Support control panel applications that provide more than one control panel.
- Clean-up to improve readability. svn path=/trunk/; revision=11468
This commit is contained in:
parent
d338969f54
commit
f776678f2d
1 changed files with 152 additions and 120 deletions
|
@ -17,7 +17,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
/* $Id: control.c,v 1.5 2004/09/15 16:03:09 fireball Exp $
|
/* $Id: control.c,v 1.6 2004/10/29 12:27:58 ekohl Exp $
|
||||||
*
|
*
|
||||||
* PROJECT: ReactOS System Control Panel
|
* PROJECT: ReactOS System Control Panel
|
||||||
* FILE: lib/cpl/system/control.c
|
* FILE: lib/cpl/system/control.c
|
||||||
|
@ -52,11 +52,11 @@ typedef LONG (CALLBACK *CPLAPPLETFUNC)(HWND hwndCPL, UINT uMsg, LPARAM lParam1,
|
||||||
typedef struct CPLLISTENTRY
|
typedef struct CPLLISTENTRY
|
||||||
{
|
{
|
||||||
TCHAR pszPath[MAX_PATH];
|
TCHAR pszPath[MAX_PATH];
|
||||||
HMODULE hDLL;
|
HMODULE hDll;
|
||||||
CPLAPPLETFUNC pFunc;
|
CPLAPPLETFUNC pFunc;
|
||||||
CPLINFO CPLInfo;
|
CPLINFO CplInfo;
|
||||||
int nIndex;
|
int nIndex;
|
||||||
} CPLLISTENTRY;
|
} CPLLISTENTRY, *PCPLLISTENTRY;
|
||||||
|
|
||||||
|
|
||||||
HWND hListView;
|
HWND hListView;
|
||||||
|
@ -64,116 +64,130 @@ HINSTANCE hInst;
|
||||||
HWND hMainWnd;
|
HWND hMainWnd;
|
||||||
DEVMODE pDevMode;
|
DEVMODE pDevMode;
|
||||||
|
|
||||||
void dbgprint(TCHAR *format,...)
|
VOID dbgprint(TCHAR *format,...)
|
||||||
{
|
{
|
||||||
TCHAR buf[1000];
|
TCHAR buf[1000];
|
||||||
va_list va;
|
va_list va;
|
||||||
|
|
||||||
va_start(va,format);
|
va_start(va,format);
|
||||||
_vstprintf(buf,format,va);
|
_vstprintf(buf,format,va);
|
||||||
OutputDebugString(buf);
|
OutputDebugString(buf);
|
||||||
va_end(va);
|
va_end(va);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PopulateCPLList(HWND hLisCtrl)
|
VOID PopulateCPLList(HWND hLisCtrl)
|
||||||
{
|
{
|
||||||
WIN32_FIND_DATA fd;
|
WIN32_FIND_DATA fd;
|
||||||
HANDLE hFind;
|
HANDLE hFind;
|
||||||
TCHAR pszSearchPath[MAX_PATH];
|
TCHAR pszSearchPath[MAX_PATH];
|
||||||
HIMAGELIST hImgListSmall;
|
HIMAGELIST hImgListSmall;
|
||||||
HIMAGELIST hImgListLarge;
|
HIMAGELIST hImgListLarge;
|
||||||
int C_Depth;
|
int ColorDepth;
|
||||||
|
HMODULE hDll;
|
||||||
|
CPLAPPLETFUNC pFunc;
|
||||||
|
TCHAR pszPath[MAX_PATH];
|
||||||
|
|
||||||
GetSystemDirectory(pszSearchPath,MAX_PATH);
|
/* Icon drawing mode */
|
||||||
_tcscat(pszSearchPath,_T("\\*.cpl"));
|
|
||||||
hFind = FindFirstFile(pszSearchPath,&fd);
|
|
||||||
|
|
||||||
/* Icon drawing mode */
|
|
||||||
pDevMode.dmSize = sizeof(DEVMODE);
|
pDevMode.dmSize = sizeof(DEVMODE);
|
||||||
pDevMode.dmDriverExtra = 0;
|
pDevMode.dmDriverExtra = 0;
|
||||||
|
|
||||||
EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&pDevMode);
|
EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&pDevMode);
|
||||||
switch(pDevMode.dmBitsPerPel)
|
switch (pDevMode.dmBitsPerPel)
|
||||||
{
|
{
|
||||||
case 32: C_Depth = ILC_COLOR32; break;
|
case 32: ColorDepth = ILC_COLOR32; break;
|
||||||
case 24: C_Depth = ILC_COLOR24; break;
|
case 24: ColorDepth = ILC_COLOR24; break;
|
||||||
case 16: C_Depth = ILC_COLOR16; break;
|
case 16: ColorDepth = ILC_COLOR16; break;
|
||||||
case 8: C_Depth = ILC_COLOR8; break;
|
case 8: ColorDepth = ILC_COLOR8; break;
|
||||||
case 4: C_Depth = ILC_COLOR4; break;
|
case 4: ColorDepth = ILC_COLOR4; break;
|
||||||
default: C_Depth = ILC_COLOR; break;
|
default: ColorDepth = ILC_COLOR; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
hImgListSmall = ImageList_Create(16,16,C_Depth | ILC_MASK,256,1000);
|
hImgListSmall = ImageList_Create(16,16,ColorDepth | ILC_MASK,5,5);
|
||||||
hImgListLarge = ImageList_Create(32,32,C_Depth | ILC_MASK,256,1000);
|
hImgListLarge = ImageList_Create(32,32,ColorDepth | ILC_MASK,5,5);
|
||||||
|
|
||||||
|
GetSystemDirectory(pszSearchPath,MAX_PATH);
|
||||||
|
_tcscat(pszSearchPath,_T("\\*.cpl"));
|
||||||
|
|
||||||
while(hFind != INVALID_HANDLE_VALUE)
|
hFind = FindFirstFile(pszSearchPath,&fd);
|
||||||
|
while (hFind != INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
CPLLISTENTRY *pEntry;
|
PCPLLISTENTRY pEntry;
|
||||||
CTL_DEBUG((_T("Found %s\r\n"),fd.cFileName));
|
CTL_DEBUG((_T("Found %s\r\n"), fd.cFileName));
|
||||||
pEntry = (CPLLISTENTRY*)malloc(sizeof(CPLLISTENTRY));
|
|
||||||
if(!pEntry)
|
|
||||||
break;
|
|
||||||
_tcscpy(pEntry->pszPath,pszSearchPath);
|
|
||||||
*_tcsrchr(pEntry->pszPath,'\\')=0;
|
|
||||||
_tcscat(pEntry->pszPath,_T("\\"));
|
|
||||||
_tcscat(pEntry->pszPath,fd.cFileName);
|
|
||||||
|
|
||||||
pEntry->hDLL = LoadLibrary(pEntry->pszPath);
|
_tcscpy(pszPath, pszSearchPath);
|
||||||
CTL_DEBUG((_T("Handle %08X\r\n"),pEntry->hDLL));
|
*_tcsrchr(pszPath, '\\')=0;
|
||||||
pEntry->pFunc = (CPLAPPLETFUNC)GetProcAddress(pEntry->hDLL,"CPlApplet");
|
_tcscat(pszPath, _T("\\"));
|
||||||
CTL_DEBUG((_T("CPLFunc %08X\r\n"),pEntry->pFunc));
|
_tcscat(pszPath, fd.cFileName);
|
||||||
if(pEntry->pFunc && pEntry->pFunc(hLisCtrl,CPL_INIT,0,0))
|
|
||||||
|
hDll = LoadLibrary(pszPath);
|
||||||
|
CTL_DEBUG((_T("Handle %08X\r\n"), hDll));
|
||||||
|
|
||||||
|
pFunc = (CPLAPPLETFUNC)GetProcAddress(hDll, "CPlApplet");
|
||||||
|
CTL_DEBUG((_T("CPLFunc %08X\r\n"), pFunc));
|
||||||
|
|
||||||
|
if (pFunc && pFunc(hLisCtrl, CPL_INIT, 0, 0))
|
||||||
{
|
{
|
||||||
int i;
|
UINT i, uPanelCount;
|
||||||
for(i=0;i<pEntry->pFunc(hLisCtrl,CPL_GETCOUNT,0,0);i++)
|
|
||||||
|
uPanelCount = (UINT)pFunc(hLisCtrl, CPL_GETCOUNT, 0, 0);
|
||||||
|
for (i = 0; i < uPanelCount; i++)
|
||||||
{
|
{
|
||||||
HICON hIcon;
|
HICON hIcon;
|
||||||
TCHAR Name[MAX_PATH];
|
TCHAR Name[MAX_PATH];
|
||||||
int index;
|
int index;
|
||||||
pEntry->pFunc(hLisCtrl,CPL_INQUIRE,0,(LPARAM)&pEntry->CPLInfo);
|
|
||||||
|
|
||||||
hIcon = LoadImage(pEntry->hDLL,MAKEINTRESOURCE(pEntry->CPLInfo.idIcon),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
|
pEntry = (PCPLLISTENTRY)malloc(sizeof(CPLLISTENTRY));
|
||||||
|
if (pEntry == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
memset(pEntry, 0, sizeof(CPLLISTENTRY));
|
||||||
|
pEntry->hDll = hDll;
|
||||||
|
pEntry->pFunc = pFunc;
|
||||||
|
_tcscpy(pEntry->pszPath, pszPath);
|
||||||
|
|
||||||
|
pEntry->pFunc(hLisCtrl, CPL_INQUIRE, (LPARAM)i, (LPARAM)&pEntry->CplInfo);
|
||||||
|
hIcon = LoadImage(pEntry->hDll,MAKEINTRESOURCE(pEntry->CplInfo.idIcon),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
|
||||||
index = ImageList_AddIcon(hImgListSmall,hIcon);
|
index = ImageList_AddIcon(hImgListSmall,hIcon);
|
||||||
DestroyIcon(hIcon);
|
DestroyIcon(hIcon);
|
||||||
hIcon = LoadImage(pEntry->hDLL,MAKEINTRESOURCE(pEntry->CPLInfo.idIcon),IMAGE_ICON,32,32,LR_DEFAULTCOLOR);
|
hIcon = LoadImage(pEntry->hDll,MAKEINTRESOURCE(pEntry->CplInfo.idIcon),IMAGE_ICON,32,32,LR_DEFAULTCOLOR);
|
||||||
ImageList_AddIcon(hImgListLarge,hIcon);
|
ImageList_AddIcon(hImgListLarge,hIcon);
|
||||||
DestroyIcon(hIcon);
|
DestroyIcon(hIcon);
|
||||||
|
|
||||||
LoadString(pEntry->hDLL,pEntry->CPLInfo.idName,Name,MAX_PATH);
|
if (LoadString(pEntry->hDll, pEntry->CplInfo.idName, Name, MAX_PATH))
|
||||||
if(_tcslen(Name))
|
|
||||||
{
|
{
|
||||||
LV_ITEM lvi;
|
LV_ITEM lvi;
|
||||||
|
|
||||||
memset(&lvi,0x00,sizeof(lvi));
|
memset(&lvi,0x00,sizeof(lvi));
|
||||||
lvi.mask=LVIF_TEXT|LVIF_PARAM|LVIF_STATE|LVIF_IMAGE;
|
lvi.mask = LVIF_TEXT|LVIF_PARAM|LVIF_STATE|LVIF_IMAGE;
|
||||||
lvi.pszText = Name;
|
lvi.pszText = Name;
|
||||||
lvi.state=0;
|
lvi.state = 0;
|
||||||
lvi.iImage=index;
|
lvi.iImage = index;
|
||||||
lvi.lParam = (LPARAM)pEntry;
|
lvi.lParam = (LPARAM)pEntry;
|
||||||
pEntry->nIndex = ListView_InsertItem(hLisCtrl,&lvi);
|
pEntry->nIndex = ListView_InsertItem(hLisCtrl,&lvi);
|
||||||
|
|
||||||
LoadString(pEntry->hDLL,pEntry->CPLInfo.idInfo,Name,MAX_PATH);
|
if (LoadString(pEntry->hDll, pEntry->CplInfo.idInfo, Name, MAX_PATH))
|
||||||
ListView_SetItemText(hLisCtrl,pEntry->nIndex,1,Name);
|
ListView_SetItemText(hLisCtrl, pEntry->nIndex, 1, Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!FindNextFile(hFind,&fd))
|
||||||
|
hFind = INVALID_HANDLE_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
ListView_SetImageList(hLisCtrl,hImgListSmall,LVSIL_SMALL);
|
ListView_SetImageList(hLisCtrl,hImgListSmall,LVSIL_SMALL);
|
||||||
ListView_SetImageList(hLisCtrl,hImgListLarge,LVSIL_NORMAL);
|
ListView_SetImageList(hLisCtrl,hImgListLarge,LVSIL_NORMAL);
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!FindNextFile(hFind,&fd))
|
|
||||||
hFind = INVALID_HANDLE_VALUE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LRESULT CALLBACK MyWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
|
LRESULT CALLBACK MyWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
|
||||||
{
|
{
|
||||||
switch(uMsg)
|
switch (uMsg)
|
||||||
{
|
{
|
||||||
case WM_CREATE:
|
case WM_CREATE:
|
||||||
{
|
{
|
||||||
RECT rect;
|
RECT rect;
|
||||||
LV_COLUMN column;
|
LV_COLUMN column;
|
||||||
|
|
||||||
GetClientRect(hWnd,&rect);
|
GetClientRect(hWnd,&rect);
|
||||||
hListView = CreateWindow(WC_LISTVIEW,_T(""),LVS_REPORT | LVS_ALIGNLEFT | LVS_AUTOARRANGE | LVS_SINGLESEL | WS_VISIBLE | WS_CHILD | WS_TABSTOP,0,0,rect.right ,rect.bottom,hWnd,NULL,hInst,0);
|
hListView = CreateWindow(WC_LISTVIEW,_T(""),LVS_REPORT | LVS_ALIGNLEFT | LVS_AUTOARRANGE | LVS_SINGLESEL | WS_VISIBLE | WS_CHILD | WS_TABSTOP,0,0,rect.right ,rect.bottom,hWnd,NULL,hInst,0);
|
||||||
CTL_DEBUG((_T("Listview Window %08X\r\n"),hListView));
|
CTL_DEBUG((_T("Listview Window %08X\r\n"),hListView));
|
||||||
|
@ -192,54 +206,67 @@ LRESULT CALLBACK MyWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
|
||||||
PopulateCPLList(hListView);
|
PopulateCPLList(hListView);
|
||||||
ListView_SetColumnWidth(hListView,2,LVSCW_AUTOSIZE_USEHEADER);
|
ListView_SetColumnWidth(hListView,2,LVSCW_AUTOSIZE_USEHEADER);
|
||||||
ListView_Update(hListView,0);
|
ListView_Update(hListView,0);
|
||||||
|
|
||||||
|
SetFocus(hListView);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_DESTROY:
|
case WM_DESTROY:
|
||||||
PostQuitMessage(0);
|
PostQuitMessage(0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_SIZE:
|
case WM_SIZE:
|
||||||
{
|
{
|
||||||
RECT rect;
|
RECT rect;
|
||||||
|
|
||||||
GetClientRect(hWnd,&rect);
|
GetClientRect(hWnd,&rect);
|
||||||
MoveWindow(hListView,0,0,rect.right,rect.bottom,TRUE);
|
MoveWindow(hListView,0,0,rect.right,rect.bottom,TRUE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_NOTIFY:
|
case WM_NOTIFY:
|
||||||
{
|
{
|
||||||
NMHDR *phdr;
|
NMHDR *phdr;
|
||||||
phdr = (NMHDR*)lParam;
|
phdr = (NMHDR*)lParam;
|
||||||
switch(phdr->code)
|
switch(phdr->code)
|
||||||
{
|
{
|
||||||
|
case NM_RETURN:
|
||||||
case NM_DBLCLK:
|
case NM_DBLCLK:
|
||||||
{
|
{
|
||||||
int nSelect;
|
int nSelect;
|
||||||
LV_ITEM lvi;
|
LV_ITEM lvi;
|
||||||
CPLLISTENTRY *pEntry;
|
PCPLLISTENTRY pEntry;
|
||||||
|
|
||||||
nSelect=SendMessage(hListView,LVM_GETNEXTITEM,(WPARAM)-1,LVNI_FOCUSED);
|
nSelect=SendMessage(hListView,LVM_GETNEXTITEM,(WPARAM)-1,LVNI_FOCUSED);
|
||||||
|
|
||||||
if(nSelect==-1) // no items
|
if (nSelect==-1)
|
||||||
{
|
{
|
||||||
|
/* no items */
|
||||||
MessageBox(hWnd,_T("No Items in ListView"),_T("Error"),MB_OK|MB_ICONINFORMATION);
|
MessageBox(hWnd,_T("No Items in ListView"),_T("Error"),MB_OK|MB_ICONINFORMATION);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
CTL_DEBUG((_T("Select %d\r\n"),nSelect));
|
CTL_DEBUG((_T("Select %d\r\n"),nSelect));
|
||||||
memset(&lvi,0x00,sizeof(lvi));
|
memset(&lvi,0x00,sizeof(lvi));
|
||||||
lvi.iItem = nSelect;
|
lvi.iItem = nSelect;
|
||||||
lvi.mask = LVIF_PARAM;
|
lvi.mask = LVIF_PARAM;
|
||||||
ListView_GetItem(hListView,&lvi);
|
ListView_GetItem(hListView,&lvi);
|
||||||
pEntry = (CPLLISTENTRY *)lvi.lParam;
|
pEntry = (PCPLLISTENTRY)lvi.lParam;
|
||||||
CTL_DEBUG((_T("Listview DblClk Entry %08X\r\n"),pEntry));
|
CTL_DEBUG((_T("Listview DblClk Entry %08X\r\n"),pEntry));
|
||||||
if(pEntry) {
|
if (pEntry)
|
||||||
|
{
|
||||||
CTL_DEBUG((_T("Listview DblClk Entry Func %08X\r\n"),pEntry->pFunc));
|
CTL_DEBUG((_T("Listview DblClk Entry Func %08X\r\n"),pEntry->pFunc));
|
||||||
}
|
}
|
||||||
if(pEntry && pEntry->pFunc)
|
|
||||||
pEntry->pFunc(hListView,CPL_DBLCLK,pEntry->CPLInfo.lData,0);
|
if (pEntry && pEntry->pFunc)
|
||||||
|
pEntry->pFunc(hListView,CPL_DBLCLK,pEntry->CplInfo.lData,0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_COMMAND:
|
case WM_COMMAND:
|
||||||
switch(LOWORD(wParam))
|
switch (LOWORD(wParam))
|
||||||
{
|
{
|
||||||
case IDM_LARGEICONS:
|
case IDM_LARGEICONS:
|
||||||
SetWindowLong(hListView,GWL_STYLE,LVS_ICON | LVS_ALIGNLEFT | LVS_AUTOARRANGE | LVS_SINGLESEL | WS_VISIBLE | WS_CHILD|WS_BORDER|WS_TABSTOP);
|
SetWindowLong(hListView,GWL_STYLE,LVS_ICON | LVS_ALIGNLEFT | LVS_AUTOARRANGE | LVS_SINGLESEL | WS_VISIBLE | WS_CHILD|WS_BORDER|WS_TABSTOP);
|
||||||
|
@ -261,12 +288,15 @@ LRESULT CALLBACK MyWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return DefWindowProc(hWnd,uMsg,wParam,lParam);
|
return DefWindowProc(hWnd,uMsg,wParam,lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef _MSVC
|
#ifdef _MSVC
|
||||||
int WINAPI wWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,WCHAR *lpCmdLine,int nCmdShow)
|
int WINAPI wWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,WCHAR *lpCmdLine,int nCmdShow)
|
||||||
#else
|
#else
|
||||||
|
@ -275,6 +305,7 @@ int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,char *lpCmdLine,i
|
||||||
{
|
{
|
||||||
MSG msg;
|
MSG msg;
|
||||||
WNDCLASS wc;
|
WNDCLASS wc;
|
||||||
|
|
||||||
hInst = hInstance;
|
hInst = hInstance;
|
||||||
CTL_DEBUG((_T("My Control Panel\r\n")));
|
CTL_DEBUG((_T("My Control Panel\r\n")));
|
||||||
memset(&wc,0x00,sizeof(wc));
|
memset(&wc,0x00,sizeof(wc));
|
||||||
|
@ -285,12 +316,13 @@ int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,char *lpCmdLine,i
|
||||||
RegisterClass(&wc);
|
RegisterClass(&wc);
|
||||||
InitCommonControls();
|
InitCommonControls();
|
||||||
hMainWnd = CreateWindowEx(WS_EX_CLIENTEDGE,MYWNDCLASS,_T("Control Panel"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,LoadMenu(hInst,MAKEINTRESOURCE(IDM_MAINMENU)),hInst,0);
|
hMainWnd = CreateWindowEx(WS_EX_CLIENTEDGE,MYWNDCLASS,_T("Control Panel"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,LoadMenu(hInst,MAKEINTRESOURCE(IDM_MAINMENU)),hInst,0);
|
||||||
if(!hMainWnd) {
|
if (!hMainWnd)
|
||||||
|
{
|
||||||
CTL_DEBUG((_T("Unable to create window\r\n")));
|
CTL_DEBUG((_T("Unable to create window\r\n")));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
ShowWindow(hMainWnd,nCmdShow);
|
ShowWindow(hMainWnd,nCmdShow);
|
||||||
while(GetMessage(&msg,0,0,0))
|
while (GetMessage(&msg,0,0,0))
|
||||||
{
|
{
|
||||||
TranslateMessage(&msg);
|
TranslateMessage(&msg);
|
||||||
DispatchMessage(&msg);
|
DispatchMessage(&msg);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue