home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / OLS / Winnt / HCAPS32 / HCAPS32.LZH / HCAPS32.C next >
C/C++ Source or Header  |  1995-07-06  |  10KB  |  322 lines

  1. #include <windows.h>
  2. #include <ime.h>
  3. #include <winnls.h>
  4. #include <winnls32.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include "hcaps32.h"
  8. #include "hcaps32s.h"
  9.  
  10. static HWND    hwndClient;
  11. static HINSTANCE    hInstance;
  12. static UINT    afConfig;
  13. static UINT    timeDelay;
  14. static UINT    timeInterval;
  15. static char szTitle[] = "秀Caps32";
  16. static char szAppName[] = "HideCaps32";
  17. static char szConfigKey[] = "Config";
  18. static char szDelayKey[] = "RepeatDelay";
  19. static char szIntervalKey[] = "RepeatInterval";
  20. static void (*pfnSetHook)( HWND );
  21. static void (*pfnReleaseHook)( void );
  22. static void (*pfnSetConfig)( UINT, UINT, UINT );
  23. static HANDLE    hLib;
  24. static HHOOK    hhook;
  25.  
  26. static HKEY    hkey;
  27.  
  28. static void OpenReg( void ) {
  29.     static char szRoot[] = "Software\\Hidemaruo\\HideCaps";
  30.     DWORD    dwRes;
  31.     if( RegCreateKeyEx( HKEY_CURRENT_USER, szRoot, 0, 0
  32.                 , REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL
  33.                 , &hkey, &dwRes ) != ERROR_SUCCESS ) {
  34.         hkey = NULL;
  35.     }
  36. }
  37.  
  38. static void CloseReg( void ) {
  39.     RegCloseKey( hkey );
  40. }
  41.  
  42. static UINT GetInt( char* pszKey, UINT nDefault ) {
  43.     int        nGetData;
  44.     DWORD    dwType;
  45.     DWORD    cchBuffer = 0;
  46.     cchBuffer = sizeof(nGetData);
  47.     if( RegQueryValueEx( hkey, pszKey, 0, &dwType, (BYTE*)&nGetData, &cchBuffer ) != ERROR_SUCCESS
  48.      || dwType != REG_DWORD ) {
  49.         return nDefault;
  50.     }
  51.     return (UINT)nGetData;
  52. }
  53.  
  54. static void WriteInt( char* pszKey, DWORD dwData ) {
  55.     RegSetValueEx( hkey, pszKey, 0, REG_DWORD, (BYTE*)&dwData, sizeof(DWORD) );
  56. }
  57.  
  58.  
  59. void EnableButtons( HWND hwnd, BOOL fEnable ) {
  60.     if( !fEnable ) {
  61.         CheckDlgButton( hwnd, IDB_HANKAKU_HOOK, FALSE );
  62.         CheckDlgButton( hwnd, IDB_HIRAGANA_HOOK, FALSE );
  63.         CheckDlgButton( hwnd, IDB_KANA_SWITCH, FALSE );
  64.         CheckDlgButton( hwnd, IDB_HENKAN_HOOK, FALSE );
  65.         CheckDlgButton( hwnd, IDB_MUHENKAN_HOOK, FALSE );
  66.         CheckDlgButton( hwnd, IDB_RIGHTCTRL_HOOK, FALSE );
  67.     }
  68.     EnableWindow( GetDlgItem( hwnd, IDB_HANKAKU_HOOK ), fEnable );
  69.     EnableWindow( GetDlgItem( hwnd, IDB_HIRAGANA_HOOK ), fEnable );
  70.     EnableWindow( GetDlgItem( hwnd, IDB_KANA_SWITCH ), fEnable );
  71.     EnableWindow( GetDlgItem( hwnd, IDB_HENKAN_HOOK ), fEnable );
  72.     EnableWindow( GetDlgItem( hwnd, IDB_MUHENKAN_HOOK ), fEnable );
  73.     EnableWindow( GetDlgItem( hwnd, IDB_RIGHTCTRL_HOOK ), fEnable );
  74. }
  75.  
  76. int CALLBACK SetupDlgProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) {
  77.     switch( message ) {
  78.         case WM_INITDIALOG:
  79.             {
  80.                 RECT    rc;
  81.                 GetWindowRect( hwnd, &rc );
  82.                 SetWindowPos( hwnd, NULL
  83.                     , (GetSystemMetrics( SM_CXSCREEN ) - (rc.right - rc.left)) / 2
  84.                     , (GetSystemMetrics( SM_CYSCREEN ) - (rc.bottom - rc.top)) / 2
  85.                     , 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE );
  86.             }
  87.             OpenReg();
  88.             afConfig = GetInt( szConfigKey, 1 );
  89.             timeDelay = GetInt( szDelayKey, 250 );
  90.             timeInterval = GetInt( szIntervalKey, 50 );
  91.             CloseReg();
  92.             if( afConfig & FLAG_JOURNAL_HOOK ) {
  93.                 CheckDlgButton( hwnd, IDB_JOURNAL_HOOK, TRUE );
  94.                 if( afConfig & FLAG_HANKAKU_HOOK ) {
  95.                     CheckDlgButton( hwnd, IDB_HANKAKU_HOOK, TRUE );
  96.                 }
  97. //                if( afConfig & FLAG_OYAYUBI_EISUU ) {
  98. //                    CheckDlgButton( hwnd, IDB_OYAYUBI_EISUU, TRUE );
  99. //                }
  100.                 if( afConfig & FLAG_HIRAGANA_HOOK ) {
  101.                     CheckDlgButton( hwnd, IDB_HIRAGANA_HOOK, TRUE );
  102.                 }
  103.                 if( afConfig & FLAG_KANA_SWITCH ) {
  104.                     CheckDlgButton( hwnd, IDB_KANA_SWITCH, TRUE );
  105.                 }
  106.                 if( afConfig & FLAG_HENKAN_HOOK ) {
  107.                     CheckDlgButton( hwnd, IDB_HENKAN_HOOK, TRUE );
  108.                 }
  109.                 if( afConfig & FLAG_MUHENKAN_HOOK ) {
  110.                     CheckDlgButton( hwnd, IDB_MUHENKAN_HOOK, TRUE );
  111.                 }
  112.                 if( afConfig & FLAG_RIGHTCTRL_HOOK ) {
  113.                     CheckDlgButton( hwnd, IDB_RIGHTCTRL_HOOK, TRUE );
  114.                 }
  115.             } else {
  116.                 CheckDlgButton( hwnd, IDB_GETMSG_HOOK, TRUE );
  117.                 EnableButtons( hwnd, FALSE );
  118.             }
  119.             if( afConfig & FLAG_EISUU_HOOK ) {
  120.                 CheckDlgButton( hwnd, IDB_EISUU_HOOK, TRUE );
  121.             }
  122.             if( afConfig & FLAG_EISUU_KANAOFF ) {
  123.                 CheckDlgButton( hwnd, IDB_EISUU_KANAOFF, TRUE );
  124.             }
  125. //            if( afConfig & FLAG_RIGHTALT_HOOK ) {
  126. //                CheckDlgButton( hwnd, IDB_RIGHTALT_HOOK, TRUE );
  127. //            }
  128. //            if( afConfig & FLAG_SHOW_LOCKSTATE ) {
  129. //                CheckDlgButton( hwnd, IDB_SHOW_LOCKSTATE, TRUE );
  130. //            }
  131.             if( afConfig & FLAG_REPEAT_HOOK ) {
  132.                 CheckDlgButton( hwnd, IDB_REPEAT_HOOK, TRUE );
  133.             } else {
  134.                 EnableWindow( GetDlgItem( hwnd, IDE_REPEAT_DELAY ), FALSE );
  135.                 EnableWindow( GetDlgItem( hwnd, IDE_REPEAT_INTERVAL ), FALSE );
  136.             }
  137.             SetDlgItemInt( hwnd, IDE_REPEAT_DELAY, timeDelay, FALSE );
  138.             SetDlgItemInt( hwnd, IDE_REPEAT_INTERVAL, timeInterval, FALSE );
  139.             return TRUE;
  140.  
  141.         case WM_COMMAND:
  142.             if( LOWORD(wParam) == IDOK ) {
  143.                 BOOL    f;
  144.                 char    sz[33];
  145.                 afConfig = 0;
  146.                 if( IsDlgButtonChecked( hwnd, IDB_JOURNAL_HOOK ) ) {
  147.                     afConfig |= FLAG_JOURNAL_HOOK;
  148.                 }
  149.                 if( IsDlgButtonChecked( hwnd, IDB_EISUU_HOOK ) ) {
  150.                     afConfig |= FLAG_EISUU_HOOK;
  151.                 }
  152.                 if( IsDlgButtonChecked( hwnd, IDB_EISUU_KANAOFF ) ) {
  153.                     afConfig |= FLAG_EISUU_KANAOFF;
  154.                 }
  155. //                if( IsDlgButtonChecked( hwnd, IDB_OYAYUBI_EISUU ) ) {
  156. //                    afConfig |= FLAG_OYAYUBI_EISUU;
  157. //                }
  158.                 if( IsDlgButtonChecked( hwnd, IDB_HANKAKU_HOOK ) ) {
  159.                     afConfig |= FLAG_HANKAKU_HOOK;
  160.                 }
  161.                 if( IsDlgButtonChecked( hwnd, IDB_HIRAGANA_HOOK ) ) {
  162.                     afConfig |= FLAG_HIRAGANA_HOOK;
  163.                 }
  164.                 if( IsDlgButtonChecked( hwnd, IDB_KANA_SWITCH ) ) {
  165.                     afConfig |= FLAG_KANA_SWITCH;
  166.                 }
  167.                 if( IsDlgButtonChecked( hwnd, IDB_HENKAN_HOOK ) ) {
  168.                     afConfig |= FLAG_HENKAN_HOOK;
  169.                 }
  170.                 if( IsDlgButtonChecked( hwnd, IDB_REPEAT_HOOK ) ) {
  171.                     afConfig |= FLAG_REPEAT_HOOK;
  172.                 }
  173.                 if( IsDlgButtonChecked( hwnd, IDB_MUHENKAN_HOOK ) ) {
  174.                     afConfig |= FLAG_MUHENKAN_HOOK;
  175.                 }
  176.                 if( IsDlgButtonChecked( hwnd, IDB_RIGHTCTRL_HOOK ) ) {
  177.                     afConfig |= FLAG_RIGHTCTRL_HOOK;
  178.                 }
  179. //                if( IsDlgButtonChecked( hwnd, IDB_RIGHTALT_HOOK ) ) {
  180. //                    afConfig |= FLAG_RIGHTALT_HOOK;
  181. //                }
  182. //                if( IsDlgButtonChecked( hwnd, IDB_SHOW_LOCKSTATE ) ) {
  183. //                    afConfig |= FLAG_SHOW_LOCKSTATE;
  184. //                }
  185.                 timeDelay = GetDlgItemInt( hwnd, IDE_REPEAT_DELAY, &f, FALSE );
  186.                 timeInterval = GetDlgItemInt( hwnd, IDE_REPEAT_INTERVAL, &f, FALSE );
  187.                 OpenReg();
  188.                 WriteInt( szConfigKey, afConfig );
  189.                 WriteInt( szDelayKey, timeDelay );
  190.                 WriteInt( szIntervalKey, timeInterval );
  191.                 CloseReg();
  192.                 EndDialog( hwnd, IDOK );
  193.             } else if( LOWORD(wParam) == IDB_REPEAT_HOOK ) {
  194.                 BOOL    f = IsDlgButtonChecked( hwnd, IDB_REPEAT_HOOK );
  195.                 EnableWindow( GetDlgItem( hwnd, IDE_REPEAT_DELAY ), f );
  196.                 EnableWindow( GetDlgItem( hwnd, IDE_REPEAT_INTERVAL ), f );
  197.             } else if( LOWORD(wParam) == IDCANCEL ) {
  198.                 EndDialog( hwnd, IDCANCEL );
  199.             } else if( LOWORD(wParam) == IDB_HELP ) {
  200.                 char    sz[200];
  201.                 GetModuleFileName( hInstance, sz, sizeof(sz) );
  202.                 strcpy( sz + strlen(sz) - 3, "hlp" );
  203.                 WinHelp( hwnd, sz, HELP_CONTENTS, 0 );
  204.             } else if( LOWORD(wParam) == IDB_JOURNAL_HOOK ) {
  205.                 EnableButtons( hwnd, TRUE );
  206.             } else if( LOWORD(wParam) == IDB_GETMSG_HOOK ) {
  207.                 EnableButtons( hwnd, FALSE );
  208.             }
  209.             break;
  210.     }
  211.     return 0;
  212. }
  213.  
  214. static void near SetupDialog( void ) {
  215.     DialogBox( hInstance, "SETUP", hwndClient
  216.         , (DLGPROC)SetupDlgProc );
  217.     SetWindowPos( hwndClient, HWND_BOTTOM, 0, 0, 0, 0
  218.         , SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE );
  219.     pfnSetConfig( afConfig, timeDelay, timeInterval );
  220. }
  221.  
  222. LONG CALLBACK ClientWndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) {
  223.     switch( message ) {
  224.         case WM_CREATE:
  225.             {
  226.                 HMENU    hmenu = GetSystemMenu( hwnd, FALSE );
  227.                 ModifyMenu( hmenu, SC_RESTORE, MF_BYCOMMAND | MF_STRING | MF_ENABLED
  228.                     , CMD_SETUP,  "設定(&S)..." );
  229.                 DeleteMenu( hmenu, SC_SIZE, MF_BYCOMMAND);
  230.                 DeleteMenu( hmenu, SC_MINIMIZE, MF_BYCOMMAND);
  231.                 DeleteMenu( hmenu, SC_MAXIMIZE, MF_BYCOMMAND);
  232.             }
  233.             return TRUE;
  234.  
  235.         case WM_SYSCOMMAND:
  236.             if( wParam == CMD_SETUP ) {
  237.                 SetupDialog();
  238.             } else if( wParam == SC_RESTORE || wParam == SC_MAXIMIZE ) {
  239.                 //
  240.             } else {
  241.                 return DefWindowProc( hwnd, WM_SYSCOMMAND, wParam, lParam );
  242.             }
  243.             break;
  244.  
  245.         case WM_QUERYOPEN:
  246.             SetupDialog();
  247. //            PostMessage( hwnd, WM_SYSCOMMAND, CMD_SETUP, 0L );
  248.             break;
  249.  
  250.         case WM_DESTROY:
  251.             PostQuitMessage( 0 );
  252.             break;
  253.  
  254.         default:
  255.             return DefWindowProc( hwnd, message, wParam, lParam );
  256.     }
  257.     return 0L;
  258. }
  259.  
  260. int PASCAL WinMain( HANDLE hInstanceIn, HANDLE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) {
  261.     MSG    msg;
  262.     WNDCLASS wc;
  263.     hInstance = hInstanceIn;
  264.     if( (hwndClient = FindWindow( szAppName, NULL )) != NULL) {
  265.         BringWindowToTop( hwndClient );
  266.         return 1;
  267.     }
  268.     hLib = LoadLibrary( "HCAPS32S.DLL" );
  269.     if( hLib == 0 ) {
  270.         MessageBox( NULL, "hcap32s.dllが見つかりません。", NULL, MB_OK | MB_ICONHAND );
  271.         return TRUE;
  272.     }
  273.     wc.style         = 0;
  274.     wc.lpfnWndProc     = (WNDPROC)ClientWndProc;
  275.     wc.cbClsExtra     = 0;
  276.     wc.cbWndExtra     = 0;
  277.     wc.hInstance     = hInstance;
  278.     wc.hIcon         = LoadIcon( hInstance, MAKEINTRESOURCE( IDI_HIDECAPS ) );
  279.     wc.hCursor         = LoadCursor(NULL, IDC_ARROW);
  280.     wc.hbrBackground = NULL;
  281.     wc.lpszMenuName     = NULL;
  282.     wc.lpszClassName = szAppName;
  283.     if( !RegisterClass( &wc ) ) {
  284.         return FALSE;
  285.     }
  286.     hwndClient = CreateWindow( szAppName, szTitle
  287.                 , WS_OVERLAPPEDWINDOW
  288.                 , 0, 0, 0, 0
  289.                 , HWND_DESKTOP
  290.                 , NULL, hInstance, NULL );
  291.     if( hwndClient == NULL ) {
  292.         return FALSE;
  293.     }
  294.     ShowWindow( hwndClient, SW_SHOWMINNOACTIVE );
  295.     UpdateWindow( hwndClient );
  296.     OpenReg();
  297.     afConfig = GetInt( szConfigKey, 1 );
  298.     timeDelay = GetInt( szDelayKey, 250 );
  299.     timeInterval = GetInt( szIntervalKey, 50 );
  300.     CloseReg();
  301.  
  302.     *((FARPROC*)&pfnSetHook) = GetProcAddress( hLib, "SetHook" );
  303.     *((FARPROC*)&pfnReleaseHook) = GetProcAddress( hLib, "ReleaseHook" );
  304.     *((FARPROC*)&pfnSetConfig) = GetProcAddress( hLib, "SetConfig" );
  305.  
  306.     pfnSetConfig( afConfig, timeDelay, timeInterval );
  307.     pfnSetHook( hwndClient );
  308.     while( GetMessage( &msg, NULL, 0, 0 ) ) {
  309.         if( msg.message == WM_CANCELJOURNAL
  310.          || (msg.message == WM_IME_REPORT && msg.wParam == IR_IMESELECT) ) {
  311.             pfnReleaseHook();
  312.             pfnSetHook( hwndClient );
  313.         }
  314.         TranslateMessage( &msg );
  315.         DispatchMessage( &msg );
  316.     }
  317.     pfnReleaseHook();
  318.     FreeLibrary( hLib );
  319.     return TRUE;
  320. }
  321.  
  322.