home *** CD-ROM | disk | FTP | other *** search
/ Freelog 3 / Freelog003.iso / Logs / Systeme / EnumWin / Source / ENUMWIN.CPP next >
C/C++ Source or Header  |  1998-09-03  |  10KB  |  314 lines

  1. // JTHZ Windows 32 enumerator and task-(de)activator
  2. // Programmed using Borland C++ 5.02
  3.  
  4. #include <windows.h>
  5. #include <commctrl.h>
  6. #include "enumwin.h"
  7.  
  8. LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);
  9. BOOL CALLBACK EnumChildProc(HWND,LPARAM);
  10. VOID RecurseExpanding(HWND,HTREEITEM);
  11. VOID SetWindow(HWND,int);
  12. BOOL CALLBACK SettingsFunc(HWND,UINT,WPARAM,LPARAM);
  13. VOID PutProfileInt(LPCTSTR,UINT);
  14.  
  15. const UINT NUMPARTS=4; // n statuswnd-parts
  16. UINT AlwaysOnTop,ShowWarnings;
  17. HINSTANCE hInst;
  18. HWND hTreeWndCtrl,hStatusWnd;
  19. WINDOWPLACEMENT wp;
  20.  
  21. #pragma argsused
  22. int WINAPI WinMain(HINSTANCE hThisInst,HINSTANCE hPrev,LPSTR lpszArgs,int nWinMode){
  23.     const char mutexName[]="JTHZ enum",className[]="Julius";
  24.       UINT parts[NUMPARTS];
  25.     HANDLE hAccel;
  26.     HWND hWnd;
  27.     MSG msg;
  28.     RECT WinDim;
  29.     WNDCLASSEX wcl;
  30.     // just one instance of this babe:
  31.     if(OpenMutex(0,FALSE,mutexName)) // app is already running!
  32.         return 0;
  33.     HANDLE mutex=CreateMutex(NULL,TRUE,mutexName);
  34.     hInst=hThisInst;
  35.     wcl.cbSize=sizeof(WNDCLASSEX);
  36.     wcl.hInstance=hThisInst;
  37.     wcl.lpszClassName=className;
  38.     wcl.lpfnWndProc=WindowFunc;
  39.     wcl.style=0;
  40.     wcl.hIcon=LoadIcon(hThisInst,"ICON1");
  41.     wcl.hIconSm=LoadIcon(hThisInst,"ICON2");
  42.     wcl.hCursor=LoadCursor(NULL,IDC_ARROW);
  43.     wcl.lpszMenuName="BORG";
  44.     wcl.cbClsExtra=0;
  45.     wcl.cbWndExtra=0;
  46.     wcl.hbrBackground=GetStockObject(LTGRAY_BRUSH);
  47.     if(!RegisterClassEx(&wcl))
  48.         return 0;
  49.     hWnd=CreateWindow(
  50.         className,
  51.         "JTHZ Window-enumerator",
  52.         WS_OVERLAPPEDWINDOW,
  53.         GetPrivateProfileInt(INI_SECTION,"X",CW_USEDEFAULT,INI_FILE),
  54.         GetPrivateProfileInt(INI_SECTION,"Y",CW_USEDEFAULT,INI_FILE),
  55.         GetPrivateProfileInt(INI_SECTION,"W",CW_USEDEFAULT,INI_FILE),
  56.         GetPrivateProfileInt(INI_SECTION,"H",CW_USEDEFAULT,INI_FILE),
  57.         HWND_DESKTOP,
  58.         NULL,
  59.         hThisInst,
  60.         NULL
  61.     );
  62.     InitCommonControls();
  63.     // statusbar
  64.     hStatusWnd=CreateStatusWindow(WS_CHILD|WS_VISIBLE,"",hWnd,IDC_STATUS);
  65.     GetClientRect(hWnd,&WinDim);
  66.     for(UINT i=1;i<=NUMPARTS;i++)
  67.         parts[i-1]=WinDim.right/NUMPARTS*i;
  68.     SendMessage(hStatusWnd,SB_SETPARTS,4,(LPARAM)parts);
  69.     // treeview
  70.     hTreeWndCtrl=CreateWindow(
  71.         WC_TREEVIEW,
  72.         "Jolanda",
  73.         WS_VISIBLE|WS_TABSTOP|WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT,
  74.         CW_USEDEFAULT,
  75.         CW_USEDEFAULT,
  76.         CW_USEDEFAULT,
  77.         CW_USEDEFAULT,
  78.         hWnd,
  79.         NULL,
  80.         hThisInst,
  81.         NULL
  82.     );
  83.     // create and use imageList
  84.     HIMAGELIST imgList=ImageList_Create(15,15,ILC_COLOR4|ILC_MASK,4,0);
  85.     char resID[2][5]={"LED1","LED2"};
  86.     for(UINT i=0;i<2;i++){
  87.         HBITMAP hBit=LoadBitmap(hThisInst,resID[i]);
  88.         // RGB(255,255,255) is used as transparent masking color
  89.         ImageList_AddMasked(imgList,hBit,RGB(255,255,255));
  90.         DeleteObject(hBit);
  91.     }
  92.     TreeView_SetImageList(hTreeWndCtrl,imgList,TVSIL_NORMAL);
  93.     hAccel=LoadAccelerators(hThisInst,"BORG");
  94.     ShowWindow(hWnd,nWinMode);
  95.     UpdateWindow(hWnd);
  96.     AlwaysOnTop=GetPrivateProfileInt(INI_SECTION,"Topmost",0,INI_FILE);
  97.     ShowWarnings=GetPrivateProfileInt(INI_SECTION,"Warnings",1,INI_FILE);
  98.     if(AlwaysOnTop)
  99.         SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
  100.     SendMessage(hWnd,WM_COMMAND,IDM_UPDATE,0);
  101.     while(GetMessage(&msg,NULL,0,0))
  102.         if(!TranslateAccelerator(hWnd,hAccel,&msg)){
  103.             TranslateMessage(&msg);
  104.             DispatchMessage(&msg);
  105.         }
  106.     ReleaseMutex(mutex);
  107.     return msg.wParam;
  108. }
  109.  
  110. #pragma warn -pia
  111. LRESULT CALLBACK WindowFunc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam){
  112.     char*winText;
  113.       UINT i,textLength,parts[NUMPARTS];
  114.     HCURSOR hCursor;
  115.     HTREEITEM hti;
  116.     HWND win;
  117.     NMHDR*nmptr;
  118.     RECT clientRect,statusRect;
  119.     switch(message){
  120.         case WM_COMMAND:
  121.             switch(LOWORD(wParam)){
  122.                 case IDM_QUIT:
  123.                     DestroyWindow(hWnd);
  124.                     break;
  125.                 case IDM_UPDATE:
  126.                     hCursor=SetCursor(LoadCursor(NULL,IDC_WAIT));
  127.                     LockWindowUpdate(hWnd);
  128.                     TreeView_DeleteAllItems(hTreeWndCtrl);
  129.                     EnumWindows((WNDENUMPROC)EnumChildProc,(LPARAM)TVI_ROOT);
  130.                     TreeView_EnsureVisible(hTreeWndCtrl,TreeView_GetRoot(hTreeWndCtrl));
  131.                     LockWindowUpdate(0);
  132.                     SetCursor(hCursor);
  133.                     break;
  134.                 case IDM_HIDE:
  135.                     SetWindow(hWnd,SW_HIDE);
  136.                     break;
  137.                 case IDM_SHOW:
  138.                     SetWindow(hWnd,SW_SHOW);
  139.                     break;
  140.                 case IDM_MIN:
  141.                     SetWindow(hWnd,SW_SHOWMINIMIZED);
  142.                     break;
  143.                 case IDM_MAX:
  144.                     SetWindow(hWnd,SW_SHOWMAXIMIZED);
  145.                     break;
  146.                 case IDM_TOTOP:
  147.                     SetWindow(hWnd,SW_SHOW);
  148.                     BringWindowToTop(hWnd);
  149.                     break;
  150.                 case IDM_RESTORE:
  151.                     SetWindow(hWnd,SW_RESTORE);
  152.                     break;
  153.                 case IDM_SETTINGS:
  154.                     DialogBox(hInst,"SETTINGS",hWnd,(DLGPROC)SettingsFunc);
  155.                     SetWindowPos(hWnd,AlwaysOnTop?HWND_TOPMOST:HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
  156.                     break;
  157.                 case IDM_COLLAPSE:
  158.                     // only collapsing root-items collapses whole treeview
  159.                     hCursor=SetCursor(LoadCursor(NULL,IDC_WAIT));
  160.                     LockWindowUpdate(hWnd);
  161.                     hti=TreeView_GetRoot(hTreeWndCtrl);
  162.                     TreeView_Expand(hTreeWndCtrl,hti,TVE_COLLAPSE);
  163.                     while(hti=TreeView_GetNextSibling(hTreeWndCtrl,hti))
  164.                         TreeView_Expand(hTreeWndCtrl,hti,TVE_COLLAPSE);
  165.                     TreeView_EnsureVisible(hTreeWndCtrl,TreeView_GetRoot(hTreeWndCtrl));
  166.                     LockWindowUpdate(0);
  167.                     SetCursor(hCursor);
  168.                     break;
  169.                 case IDM_EXPAND:
  170.                     hCursor=SetCursor(LoadCursor(NULL,IDC_WAIT));
  171.                     LockWindowUpdate(hWnd);
  172.                     RecurseExpanding(hTreeWndCtrl,TreeView_GetRoot(hTreeWndCtrl));
  173.                     TreeView_EnsureVisible(hTreeWndCtrl,TreeView_GetRoot(hTreeWndCtrl));
  174.                     LockWindowUpdate(0);
  175.                     SetCursor(hCursor);
  176.                     break;
  177.             }
  178.             break;
  179.         case WM_DESTROY:
  180.             wp.length=sizeof(WINDOWPLACEMENT);
  181.             GetWindowPlacement(hWnd,&wp);
  182.             PutProfileInt("X",wp.rcNormalPosition.left);
  183.             PutProfileInt("Y",wp.rcNormalPosition.top);
  184.             PutProfileInt("W",wp.rcNormalPosition.right-wp.rcNormalPosition.left);
  185.             PutProfileInt("H",wp.rcNormalPosition.bottom-wp.rcNormalPosition.top);
  186.             PutProfileInt("Topmost",AlwaysOnTop);
  187.             PutProfileInt("Warnings",ShowWarnings);
  188.             PostQuitMessage(0);
  189.             break;
  190.         case WM_SIZE:
  191.             // pass msg to statuswindow
  192.             SendMessage(hStatusWnd,WM_SIZE,wParam,lParam);
  193.             GetClientRect(hWnd,&clientRect);
  194.             GetWindowRect(hStatusWnd,&statusRect);
  195.             MoveWindow(hTreeWndCtrl,0,0,clientRect.right-clientRect.left,
  196.                     clientRect.bottom-clientRect.top-(statusRect.bottom-statusRect.top),TRUE);
  197.             for(i=1;i<=NUMPARTS;i++)
  198.                 parts[i-1]=clientRect.right/NUMPARTS*i;
  199.             SendMessage(hStatusWnd,SB_SETPARTS,4,(LPARAM)parts);
  200.             break;
  201.         case WM_NOTIFY:
  202.             nmptr=(LPNMHDR)lParam;
  203.             if(nmptr->code==TVN_SELCHANGED){
  204.                 win=(HWND)((LPNM_TREEVIEW)nmptr)->itemNew.lParam;
  205.                 textLength=GetWindowTextLength(win);
  206.                 if(textLength){
  207.                     winText=new char[textLength+2];
  208.                     GetWindowText(win,winText,textLength+1);
  209.                 }
  210.                 else{
  211.                     winText=new char[8];
  212.                     wsprintf(winText,"%s","zerolength");
  213.                 }
  214.                 SendMessage(hStatusWnd,SB_SETTEXT,0,(LPARAM)winText);
  215.                 delete[]winText;
  216.                 winText=new char[64];
  217.                 wsprintf(winText,"ID: 0x%X",GetWindowLong(win,GWL_ID));
  218.                 SendMessage(hStatusWnd,SB_SETTEXT,1,(LPARAM)winText);
  219.                 wsprintf(winText,"PROC: 0x%X",GetWindowLong(win,GWL_WNDPROC));
  220.                 SendMessage(hStatusWnd,SB_SETTEXT,2,(LPARAM)winText);
  221.                 GetClassName(win,winText,64);
  222.                 SendMessage(hStatusWnd,SB_SETTEXT,3,(LPARAM)winText);
  223.                 delete[]winText;
  224.             }
  225.             break;
  226.         default:
  227.             return DefWindowProc(hWnd,message,wParam,lParam);
  228.     }
  229.     return 0;
  230. }
  231.  
  232. #pragma argsused
  233. BOOL CALLBACK EnumChildProc(HWND hWnd,LPARAM lParam){
  234.     char*winText;
  235.     HTREEITEM tvParent;
  236.     TV_INSERTSTRUCT tvs;
  237.     TV_ITEM tvi;
  238.       UINT textLength=GetWindowTextLength(hWnd);
  239.     if(textLength){
  240.         winText=new char[textLength+2];
  241.         GetWindowText(hWnd,winText,textLength+1);
  242.     }
  243.     else{
  244.         winText=new char[16];
  245.         wsprintf(winText,"zerolength");
  246.     }
  247.     tvi.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM;
  248.     tvi.iImage=0;
  249.     tvi.iSelectedImage=1;
  250.     tvi.pszText=winText;
  251.     tvi.lParam=(LPARAM)hWnd; // remember associated window
  252.     tvs.hInsertAfter=TVI_SORT;
  253.     tvs.hParent=(HTREEITEM)lParam;
  254.     tvs.item=tvi;
  255.     tvParent=TreeView_InsertItem(hTreeWndCtrl,&tvs);
  256.     delete[]winText;
  257.     EnumChildWindows(hWnd,(WNDENUMPROC)EnumChildProc,(LPARAM)tvParent);
  258.     return TRUE;
  259. }
  260.  
  261. VOID RecurseExpanding(HWND hTreeWndCtrl,HTREEITEM hti){
  262.     // self-calling baby to expand all treeview-nodes
  263.     HTREEITEM htiChild,htiSibling=hti;
  264.     TreeView_Expand(hTreeWndCtrl,htiSibling,TVE_EXPAND);
  265.     if(htiChild=TreeView_GetChild(hTreeWndCtrl,htiSibling))
  266.         RecurseExpanding(hTreeWndCtrl,htiChild);
  267.     while(htiSibling=TreeView_GetNextSibling(hTreeWndCtrl,htiSibling)){
  268.         TreeView_Expand(hTreeWndCtrl,htiSibling,TVE_EXPAND);
  269.         if(htiChild=TreeView_GetChild(hTreeWndCtrl,htiSibling))
  270.             RecurseExpanding(hTreeWndCtrl,htiChild);
  271.     }
  272. }
  273.  
  274. VOID SetWindow(HWND owner,int state){
  275.     // force a window to a certain state
  276.     TV_ITEM tvi;
  277.     HTREEITEM hti=TreeView_GetSelection(hTreeWndCtrl);
  278.     if(hti){
  279.         if(ShowWarnings&&MessageBox(owner,"This can corrupt current Windows-session\nContinue anyway?","Warning!",MB_YESNO|MB_ICONWARNING)!=IDYES)
  280.             return;
  281.         tvi.mask=TVIF_PARAM; // lParam contains window-handle
  282.         tvi.hItem=hti;
  283.         TreeView_GetItem(hTreeWndCtrl,&tvi);
  284.         ShowWindow((HWND)tvi.lParam,state);
  285.     }
  286.     else if(ShowWarnings)
  287.         MessageBox(owner,"Nothing selected",NULL,MB_ICONHAND);
  288. }
  289.  
  290. #pragma argsused
  291. BOOL CALLBACK SettingsFunc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam){
  292.     switch(message){
  293.         case WM_COMMAND:
  294.             if(LOWORD(wParam)==IDOK){
  295.                 AlwaysOnTop=IsDlgButtonChecked(hWnd,IDC_TOP);
  296.                 ShowWarnings=IsDlgButtonChecked(hWnd,IDC_WARNING);
  297.                 EndDialog(hWnd,0);
  298.                 return TRUE;
  299.             }
  300.             break;
  301.         case WM_INITDIALOG:
  302.             CheckDlgButton(hWnd,IDC_TOP,AlwaysOnTop);
  303.             CheckDlgButton(hWnd,IDC_WARNING,ShowWarnings);
  304.             break;
  305.     }
  306.     return FALSE;
  307. }
  308.  
  309. VOID PutProfileInt(LPCTSTR lpKeyName,UINT value){
  310.     char buf[16];
  311.     wsprintf(buf,"%u",value);
  312.     WritePrivateProfileString(INI_SECTION,lpKeyName,buf,INI_FILE);
  313. }
  314.