// AtokSetP.cpp : Defines the entry point for the application. #include "stdafx.h" #include "resource.h" #include #include #define M_APP_END 42005 #define M_ATOKCHANGER_ON 41006 #define M_ATOKSET_ON 41007 #define M_WITHATOK_ON 41008 #define M_WITSET_ON 41009 #define M_BTON_ON 41010 #define M_CHGSUISOKU_ON 41011 #define M_ATOKCHANGER_OFF 42006 #define M_ATOKSET_OFF 42007 #define M_WITHATOK_OFF 42008 #define M_WITSET_OFF 42009 #define M_BTON_OFF 42010 #define M_CHGSUISOKU_OFF 42011 #define TM_ATOKCHANGER 1 #define TM_ATOKSET 2 #define TM_CHGSUISOKU 3 #define TM_BTON 4 #define TM_WITSET 6 #define SZ_REG_RT_PS L"\\Software\\Sharp\\PhoneStatus" #define SZ_REG_KY_PS22 L"Status22" #define SZ_REG_KY_PS29 L"Status29" #define SZ_REG_KY_PS31 L"Status31" #define SZ_REG_RT_CV L"\\Software\\JustSystem\\ATOKM\\UI" #define SZ_REG_KY_CV L"ConjeValid" #define SZ_REG_RT_LU L"\\Software\\JustSystem\\ATOKM" #define SZ_REG_KY_LU L"LastUpdate" #define SZ_REG_RT_LN L"\\Software\\JustSystem\\ATOKM\\Config" #define SZ_REG_KY_LN L"Learn" #define SLIDE_OPEN_EVENT L"SlideOpen" #define SLIDE_CLOSE_EVENT L"SlideClose" #define EXIT_THREAD_EVENT L"KBCHECK_Exit" //プロトタイプ宣言 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //Windowプロシージャ DWORD WINAPI BtSetModeThread( LPVOID ); DWORD WINAPI SlideOpenThread( LPVOID ); DWORD WINAPI SlideCloseThread( LPVOID ); typedef HRESULT (*REGNOTIFYCB)(HKEY ,LPCTSTR ,LPCTSTR ,REGISTRYNOTIFYCALLBACK ,DWORD ,NOTIFICATIONCONDITION *,HREGNOTIFY *); typedef HRESULT (*REGNOTIFYCL)(HREGNOTIFY); //グローバル変数 wchar_t szClassName[] = L"AtokSetP"; wchar_t szWindowTitle[] = L"AtokSetP"; wchar_t szMsgTitle[] = L"AtokSetPlus Ver2.1.1.0"; wchar_t exePath[256]; wchar_t iniPath[256]; char fname[256]; HINSTANCE g_hInstance; //自インスタンスハンドル HWND g_hWndMy; HWND g_hWndMB; //メニューバーハンドル HICON g_hIcon; //アイコンハンドル HWND hWndAtok = 0; RECT rc; int rc_top = 2; //ATOK文字切替バーサイズ(VS2008で変更) int rc_left = 25; int rc_bottom = 24; int rc_bottom_adj =-2; BOOL g_TI_sts = FALSE; //初期起動判定 BOOL g_AC_sts = FALSE; BOOL g_AS_sts = FALSE; BOOL g_BT_sts = FALSE; BOOL g_CS_sts = FALSE; BOOL g_WA_sts = FALSE; BOOL g_WS_sts = FALSE; BOOL g_AC_on = TRUE; //処理中ON・OFF判定 BOOL g_AS_on = TRUE; BOOL g_BT_on = TRUE; BOOL g_CS_on = TRUE; BOOL g_WA_on = TRUE; BOOL g_WS_on = TRUE; wchar_t *token; DWORD nTime = 0; BOOL g_rotation_kb = FALSE; //ローテション判定をKB開閉で行う場合はTRUE BOOL g_rotation_adeskb= FALSE;//ローテション判定をstatus22bit16で行う場合はTRUE DWORD g_KB_open = 0; //KB閉:0 KB開:1 BOOL g_nobar = FALSE; //ATOK文字切替バーを消す場合はTRUE BOOL g_log_nbar = FALSE; //デバッグ用 BOOL g_log = FALSE; //デバッグ用 //----- for trayicon(bTON) int BT_loopwait = 2000; int BT_iniCnt = 0; wchar_t *bt_ini_class[32]; //存在したらiconを削除するclass名 wchar_t *bt_ini_title[32]; //存在したらiconを削除するtitle名 //----- for AtokChanger int AC_loopwait = 500; int AC_on[2] ={0,0}; //画面方向指定 //----- for AtokSet int AS_loopwait = 500; int AS_waittime = 1500; //強制変換をする時間 int AS_waittimeDR = 1000; //強制変換をする時間(DR) int AS_iniCnt = 0; wchar_t *AS_ini_class[32]; //変換対象class名 wchar_t *AS_ini_title[32]; //変換対象title名 wchar_t *AS_ini_msg[32]; //WM_COMMAND msg DWORD AS_ini_dwset[32]; //変換入力文字種 DWORD AS_ini_dr[32]; //画面方向指定 //----- for bTON DWORD g_btcon_sts; DWORD g_btcon_sts_old; BOOL g_bticon_sts = FALSE; //iconの表示状態 HICON g_hIcon_on; //BTONアイコンハンドル HICON g_hIcon_off; //BTOFFアイコンハンドル HICON g_hIcon_atok; //ATOKアイコンハンドル NOTIFYICONDATA icdata; //NOTIFYICONDATA構造体 wchar_t g_bt_on_Path[256] =L""; wchar_t g_bt_off_Path[256] =L""; //----- for ChgSuisoku int CS_loopwait = 500; DWORD CS_ini_conjevalid[3]={1,1,1}; //推測変換ON/OFF指定{縦、横、停止} DWORD CS_ini_learn[3] ={1,1,1}; //辞書学習ON/OFF指定{縦、横、停止} //----- for WithATOK DWORD WA_ini_sts22[2][8]; //有効にする入力文字種{縦、横}×最大8種 int WA_iniCnt[2] ={0,0}; //----- for WiTset int WS_loopwait = 500; int WS_iniCnt = 0; wchar_t *WS_ini_class[32]; //変換対象class名 wchar_t *WS_ini_title[32]; //変換対象title名 wchar_t *WS_ini_fpath[32]; //変換対象filepath名 wchar_t *WS_ini_settitle[32]; //設定windowtitle文字列 //----- ini file read function ----- //----- common ini Read static void common_iniRead( LPTSTR sz ){ //全体共通オプション if( wcsstr( sz , L"devtype=" ) != NULL ) { token = wcstok( sz , L"=" ); token = wcstok( NULL, L"=" ); if ( token != NULL ){ if ( wcsstr( token , L"KB" ) != NULL ) g_rotation_kb = TRUE; if ( wcsstr( token , L"ADESKB" ) != NULL ) g_rotation_adeskb = TRUE; if ( wcsstr( token , L"NBAR" )!= NULL ) g_nobar = TRUE; if ( wcsstr( token , L"LOGNB" ) != NULL ) g_log_nbar = TRUE; if ( wcsstr( token , L"LOGD" ) != NULL ) g_log = TRUE; } return; } if( wcsstr( sz , L"atokbar=" ) != NULL ){ //ATOK文字切替バーサイズ token = wcstok( sz , L"=" ); token = wcstok( NULL, L";" ); if ( token != NULL ) rc_left = _wtoi( token ); token = wcstok( NULL, L";" ); if ( token != NULL ) rc_top = _wtoi( token ); token = wcstok( NULL, L";" ); if ( token != NULL ) rc_bottom= _wtoi( token ); token = wcstok( NULL, L";" ); if ( token != NULL ) rc_bottom_adj= _wtoi( token ); return; } } //----- trayicon ini Read static void trayicon_iniRead( LPTSTR sz ){ if( wcscmp( sz , L"OFF" ) == 0 ) g_TI_sts = FALSE; if( wcsstr( sz , L"loopwait=" ) != NULL ){ token = wcstok( sz , L"=" ); token = wcstok( NULL, L"=" ); if ( token != NULL ) BT_loopwait = _wtoi( token ); return; } if( BT_iniCnt >= 32 ) return; if( wcsstr( sz , L";" ) != NULL ) { token = wcstok( sz , L";" ); if ( token != NULL ){ bt_ini_class[BT_iniCnt] = wcsdup( token ); if ( wcscmp(bt_ini_class[BT_iniCnt],L"-") == 0 ) bt_ini_class[BT_iniCnt]=NULL; } else { return; } token = wcstok( NULL , L";" ); if ( token != NULL ){ bt_ini_title[BT_iniCnt] = wcsdup( token ); if ( wcscmp(bt_ini_title[BT_iniCnt],L"-") == 0 ) bt_ini_title[BT_iniCnt]=NULL; } else { return; } if ( bt_ini_class[BT_iniCnt]==NULL && bt_ini_title[BT_iniCnt]==NULL ) return; //-,-指定は無効 BT_iniCnt++; } } //----- Atokchanger ini Read static void Atokchanger_iniRead( LPTSTR sz ){ int dr =2; if( wcscmp( sz , L"OFF" ) == 0 ) g_AC_sts = FALSE; if( wcsstr( sz , L"loopwait=" ) != NULL ){ token = wcstok( sz , L"=" ); token = wcstok( NULL, L"=" ); if ( token != NULL ) AC_loopwait = _wtoi( token ); return; } if( wcsstr( sz , L";" ) != NULL ) { token = wcstok( sz , L";" ); if ( token != NULL ){ if ( wcscmp(token,L"P")==0 ) dr = 0; if ( wcscmp(token,L"L")==0 ) dr = 1; if ( dr == 2 ) return; token = wcstok( NULL , L";" ); if ( token != NULL ) AC_on[dr] = _wtoi( token ); } } } //----- AtokSet ini Read static void AtokSet_iniRead( LPTSTR sz ){ if( wcscmp( sz , L"OFF" ) == 0 ) g_AS_sts = FALSE; if( wcsstr( sz , L"waittime=" ) != NULL ){ token = wcstok( sz , L"=" ); token = wcstok( NULL, L"=" ); if ( token != NULL ) AS_waittime = _wtoi( token ); return; } if( wcsstr( sz , L"waittimeDR=" ) != NULL ){ token = wcstok( sz , L"=" ); token = wcstok( NULL, L"=" ); if ( token != NULL ) AS_waittimeDR = _wtoi( token ); return; } if( wcsstr( sz , L"loopwait=" ) != NULL ){ token = wcstok( sz , L"=" ); token = wcstok( NULL, L"=" ); if ( token != NULL ) AS_loopwait = _wtoi( token ); return; } if( AS_iniCnt >= 32 ) return; if( wcsstr( sz , L";" ) != NULL ) { token = wcstok( sz , L";" ); if ( token != NULL ){ AS_ini_class[AS_iniCnt] = wcsdup( token ); } else { return; } token = wcstok( NULL , L";" ); if ( token != NULL ){ AS_ini_title[AS_iniCnt] = wcsdup( token ); } else { return; } token = wcstok( NULL , L";" ); //文字種指定(0-7)省略で8を設定 if ( token != NULL ){ if ( wcscmp(token,L"-")==0 ){ AS_ini_dwset[AS_iniCnt] = 8; } else { AS_ini_dwset[AS_iniCnt] = _wtoi( token ); if ( 7 < AS_ini_dwset[AS_iniCnt]) return; } } else { return; } AS_ini_dr[AS_iniCnt] = 2; //画面方向指定省略では2をセット token = wcstok( NULL , L";" ); if ( token != NULL ){ if ( wcscmp(token , L"P")==0 ) AS_ini_dr[AS_iniCnt] = 0; if ( wcscmp(token , L"L")==0 ) AS_ini_dr[AS_iniCnt] = 1; } token = wcstok( NULL , L";" ); //WM_COMMAND if ( token != NULL ){ AS_ini_msg[AS_iniCnt] = wcsdup( token ); } else { AS_ini_msg[AS_iniCnt] = NULL; } AS_iniCnt++; } } //----- ChgSuisoku ini Read static void ChgSuisoku_iniRead( LPTSTR sz ){ int dr =3; if( wcscmp( sz , L"OFF" ) == 0 ) g_CS_sts = FALSE; if( wcsstr( sz , L"loopwait=" ) != NULL ){ token = wcstok( sz , L"=" ); token = wcstok( NULL, L"=" ); if ( token != NULL ) CS_loopwait = _wtoi( token ); return; } if( wcsstr( sz , L";" ) != NULL ) { token = wcstok( sz , L";" ); if ( token != NULL ){ if ( wcscmp(token,L"P")==0 ) dr = 0; if ( wcscmp(token,L"L")==0 ) dr = 1; if ( wcscmp(token,L"-")==0 ) dr = 2; if ( dr == 3 ) return; } CS_ini_conjevalid[dr] = 1; CS_ini_learn[dr] = 1; token = wcstok(NULL , L";" ); if ( token != NULL ){ if ( _wtoi( token ) == 0 ) CS_ini_conjevalid[dr] = 0; } token = wcstok(NULL , L";" ); if ( token != NULL ){ if ( _wtoi( token ) == 0 ) CS_ini_learn[dr] = 0; } } } //----- bTON ini Read static void bTON_iniRead( LPTSTR sz ){ if( wcscmp( sz , L"OFF" ) == 0 ) g_BT_sts = FALSE; if( wcsstr( sz , L"bton=" ) != NULL ){ token = wcstok( sz , L"=" ); token = wcstok( NULL, L"=" ); if ( token != NULL ) wcscpy( g_bt_on_Path , token ); return; } if( wcsstr( sz , L"btoff=" ) != NULL ){ token = wcstok( sz , L"=" ); token = wcstok( NULL, L"=" ); if ( token != NULL ) wcscpy( g_bt_off_Path , token ); return; } } //----- WithATOK ini Read static void WithATOK_iniRead( LPTSTR sz ){ int dr =2; if( wcscmp( sz , L"OFF" ) == 0 ) g_WA_sts = FALSE; if( wcsstr( sz , L";" ) != NULL ) { token = wcstok( sz , L";" ); if ( token != NULL ){ if ( wcscmp(token,L"P")==0 ) dr = 0; if ( wcscmp(token,L"L")==0 ) dr = 1; if ( dr == 2 ) return; WA_iniCnt[dr] = 0; token = wcstok( NULL , L";" ); while( token != NULL ){ WA_ini_sts22[dr][WA_iniCnt[dr]] = _wtoi( token ); token = wcstok( NULL , L";" ); WA_iniCnt[dr]++; } } else { return; } } } //----- WiTset ini Read static void WiTset_iniRead( LPTSTR sz ){ if( wcscmp( sz , L"OFF" ) == 0 ) g_WS_sts = FALSE; if( wcsstr( sz , L"loopwait=" ) != NULL ){ token = wcstok( sz , L"=" ); token = wcstok( NULL, L"=" ); if ( token != NULL ) WS_loopwait = _wtoi( token ); return; } if( WS_iniCnt >= 32 ) return; if( wcsstr( sz , L";" ) != NULL ) { token = wcstok( sz , L";" ); if ( token != NULL ){ WS_ini_class[WS_iniCnt] = wcsdup( token ); } else { return; } token = wcstok( NULL , L";" ); if ( token != NULL ){ WS_ini_title[WS_iniCnt] = wcsdup( token ); } else { return; } token = wcstok( NULL , L";" ); if ( token != NULL ){ WS_ini_fpath[WS_iniCnt] = wcsdup( token ); } else { return; } token = wcstok( NULL , L";" ); if ( token != NULL ){ WS_ini_settitle[WS_iniCnt] = wcsdup( token ); } else { return; } if (wcscmp(WS_ini_class[WS_iniCnt],L"-")==0 && wcscmp(WS_ini_title[WS_iniCnt],L"-")==0 && wcscmp(WS_ini_fpath[WS_iniCnt],L"-")==0) return; //-,-,-指定は無効 WS_iniCnt++; } } //----- other function ----- //----- キーボード開閉検知スレッド開始 static BOOL BeginSlideKeybd( HWND *hWnd , HANDLE *hEvent , HANDLE *hThread ){ *hEvent = CreateEvent( //EXIT用イベント生成 NULL, // セキュリティ属性 FALSE, // TRUE:手動リセット FALSE:自動リセット FALSE, // 初期状態 TRUE:シグナル状態 FALSE:非シグナル状態 EXIT_THREAD_EVENT);// オブジェクトの名前 if(*hEvent){ hThread[0] = CreateThread(NULL, 0, SlideOpenThread, (LPVOID)*hWnd, 0, NULL); if(hThread[0]){ hThread[1] = CreateThread(NULL, 0, SlideCloseThread, (LPVOID)*hWnd, 0, NULL); if(hThread[1]){ return TRUE; } CloseHandle(hThread[0]); } CloseHandle(*hEvent); } return FALSE; } //----- キーボード開閉検知スレッド終了 static void EndSlideKeybd( HANDLE *hEvent , HANDLE *hThread ){ SetEvent(*hEvent); //EXIT用イベントシグナル if(WAIT_TIMEOUT == WaitForMultipleObjects(2, hThread, TRUE, 1000)){ //キーボード開閉検知スレッド終了待ち合わせ、タイムアウト1秒 TerminateThread(hThread[0], FALSE); TerminateThread(hThread[1], FALSE); } CloseHandle(hThread[0]); CloseHandle(hThread[1]); CloseHandle(*hEvent); return; } //----- キーボード開検知スレッド static DWORD WINAPI SlideOpenThread(LPVOID lpWnd){ HANDLE hEvent[2]; hEvent[0]= OpenEvent(EVENT_ALL_ACCESS, FALSE, SLIDE_OPEN_EVENT); if(hEvent[0]){ hEvent[1] = OpenEvent(EVENT_ALL_ACCESS, FALSE, EXIT_THREAD_EVENT); if(hEvent[1]){ while(WAIT_OBJECT_0 == WaitForMultipleObjects(2, hEvent, FALSE, INFINITE)){ //KB開orEXITで開始、EXITするまでloop g_KB_open = 1; } CloseHandle(hEvent[1]); } CloseHandle(hEvent[0]); } ExitThread(0); return TRUE; } //----- キーボード閉検知スレッド static DWORD WINAPI SlideCloseThread(LPVOID lpWnd){ HANDLE hEvent[2]; hEvent[0]= OpenEvent(EVENT_ALL_ACCESS, FALSE, SLIDE_CLOSE_EVENT); if(hEvent[0]){ hEvent[1] = OpenEvent(EVENT_ALL_ACCESS, FALSE, EXIT_THREAD_EVENT); if(hEvent[1]){ while(WAIT_OBJECT_0 == WaitForMultipleObjects(2, hEvent, FALSE, INFINITE)){ g_KB_open = 0; } CloseHandle(hEvent[1]); } CloseHandle(hEvent[0]); } ExitThread(0); return TRUE; } //----- Find Atok Bar static void find_atokbar(){ HWND hWndChild; wchar_t szClass[64] = L""; hWndChild = GetWindow(HWND_DESKTOP, GW_CHILD|GW_HWNDFIRST); // Desktop配下の子window をチェック while (hWndChild){ GetClassName (hWndChild, szClass, 64); if ( wcscmp( szClass , L"Dialog" ) == 0 ){ GetWindowRect( hWndChild, &rc ); //----- if ( g_log_nbar ){ //デバッグログ用 SYSTEMTIME time; GetLocalTime(&time); FILE *flog; flog = fopen( "\\atoksetp.txt" , "a" ); fprintf(flog , "%2d:%2d:%2d " ,time.wHour,time.wMinute,time.wSecond); fprintf(flog , "left=%8d top =%8d botm=%8d \n" ,rc.left ,rc.top ,rc.bottom); fclose(flog); } //----- if (rc.left==rc_left && rc.top==rc_top && rc.bottom==rc_bottom){ hWndAtok = hWndChild; break; } } hWndChild = GetWindow(hWndChild, GW_HWNDNEXT); } } //----- delete Atok Bar(ATOK文字切替えバーを非表示) static void delete_atokbar(HWND hWnd){ HKEY hKey; DWORD dwStatus29; int i = 0; hWndAtok = 0; find_atokbar(); //文字バー検索 while ( hWndAtok == 0 && i < 40 ){ //文字バーが見つからなかったら、文字バーを表示して検索ループ ShowWindow( hWnd, SW_SHOW ); SetForegroundWindow( hWnd ); dwStatus29 = 3; if ( RegOpenKeyEx( HKEY_CURRENT_USER, SZ_REG_RT_PS, 0, KEY_ALL_ACCESS, &hKey ) == ERROR_SUCCESS ){ RegSetValueEx( hKey , SZ_REG_KY_PS29 , 0 , REG_DWORD, (CONST BYTE*)&dwStatus29, sizeof( dwStatus29 ) ); RegCloseKey( hKey ); } Sleep(500); find_atokbar(); i++; } if( hWndAtok ) SetWindowPos(hWndAtok, NULL, 0, 0, 0, 0, SWP_HIDEWINDOW); //見つかったら消す } //----- Get Reg DW値 (for common) static DWORD GetRegDW( DWORD hk , LPTSTR RegRoot , LPTSTR Regkey ){ //指定レジストリからDWORD値を取得する HKEY hKey; DWORD dwFlag = 0; DWORD dwType; DWORD dwDataSize=sizeof(DWORD); switch( hk ){ case 0: if (RegOpenKeyEx(HKEY_CLASSES_ROOT , RegRoot, 0, KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS) return dwFlag; break; case 1: if (RegOpenKeyEx(HKEY_CURRENT_USER , RegRoot, 0, KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS) return dwFlag; break; case 2: if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, RegRoot, 0, KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS) return dwFlag; break; case 4: if (RegOpenKeyEx(HKEY_USERS , RegRoot, 0, KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS) return dwFlag; break; } RegQueryValueEx(hKey, Regkey, NULL, &dwType, NULL, &dwDataSize); RegQueryValueEx(hKey, Regkey, NULL, &dwType, (LPBYTE)&dwFlag, &dwDataSize); RegCloseKey(hKey); return dwFlag; } //-----IMM set (for common) static void immSet( DWORD dwStatus22 , DWORD dr , DWORD dwConv , DWORD dwSent ){ switch(dwStatus22){ case 0: ImmSetConversionStatus(NULL, IME_CMODE_NATIVE | IME_CMODE_FULLSHAPE, dwSent); //全角かな break; case 1: ImmSetConversionStatus(NULL, IME_CMODE_NATIVE | IME_CMODE_FULLSHAPE | IME_CMODE_KATAKANA, dwSent); //全角カナ break; case 2: ImmSetConversionStatus(NULL, IME_CMODE_NATIVE | IME_CMODE_KATAKANA, dwSent); //半角カナ break; case 3: ImmSetConversionStatus(NULL, IME_CMODE_FULLSHAPE, dwSent); //全角英大 break; case 4: ImmSetConversionStatus(NULL, IME_CMODE_FULLSHAPE, dwSent); //全角英小 break; case 5: case 6: case 7: if ( g_AC_sts && g_AC_on && !AC_on[dr] ){ ImmSetConversionStatus(NULL, IME_CMODE_ROMAN | IME_CMODE_NOCONVERSION, IME_SMODE_NONE); //Atokchanger'処理 } else { ImmSetConversionStatus(NULL, IME_CMODE_ALPHANUMERIC, dwSent); //Atokchanger'無 } break; } } //----- STATUS22 set (for common) static void RegSet( DWORD dwStatus22 , DWORD dr ){ //dwStatus22={0-7} HKEY hKey; DWORD dwStatus22_now; dwStatus22_now = GetRegDW( 1 , SZ_REG_RT_PS , SZ_REG_KY_PS22 ); //----- if ( g_log ){ //デバッグログ用 SYSTEMTIME time; GetLocalTime(&time); FILE *flog; flog = fopen( "\\atoksetp.txt" , "a" ); fprintf(flog , "%2d:%2d:%2d " ,time.wHour,time.wMinute,time.wSecond); fprintf(flog , "->:PS22=%d\n" ,dwStatus22_now); fclose(flog); } //----- dwStatus22_now = (dwStatus22_now & 0xFFFFFFF8) | dwStatus22; if ( RegOpenKeyEx( HKEY_CURRENT_USER, SZ_REG_RT_PS, 0, KEY_ALL_ACCESS, &hKey ) == ERROR_SUCCESS ){ RegSetValueEx( hKey , SZ_REG_KY_PS22 , 0 , REG_DWORD, (CONST BYTE*)&dwStatus22_now, sizeof( dwStatus22 ) ); RegCloseKey( hKey ); } //----- if ( g_log ){ //デバッグログ用 SYSTEMTIME time; GetLocalTime(&time); FILE *flog; flog = fopen( "\\atoksetp.txt" , "a" ); fprintf(flog , "%2d:%2d:%2d " ,time.wHour,time.wMinute,time.wSecond); fprintf(flog , "<-:PS22=%d\n" ,dwStatus22_now); fclose(flog); } //----- } //----- キーボード開閉取得アドes用 static void AdesKB(){ DWORD dwStatus22=0; dwStatus22 = GetRegDW( 1 , SZ_REG_RT_PS , SZ_REG_KY_PS22 ); if ( (dwStatus22 & 0x010000) == 65536 ){ g_KB_open = 1; } else { g_KB_open = 0; } } //----- Create Proc( exeの起動 ) int CreateProc( LPTSTR exec_file , LPTSTR exec_arg ){ if( !CreateProcess( exec_file, exec_arg, 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. NULL, //Pointer to STARTUPINFO structure. NULL ) //Pointer to PROCESS_INFORMATION structure. ) { return 0; //終了 } return 1; } //----- lnk execute Proc int lnkExec( LPTSTR lnk_name ){ Sleep(200); SHELLEXECUTEINFO sei; ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO)); sei.cbSize = sizeof(sei); sei.lpVerb = L"Open"; sei.lpFile = lnk_name; sei.fMask = SEE_MASK_FLAG_NO_UI; //エラーを表示しないモード if ( !ShellExecuteEx(&sei) ) return 0; //起動エラー return 1; } //----- Worker Thread (for bTON) DWORD WINAPI BtSetMode_connect_Thread( IN LPVOID pParam ){ if ( g_btcon_sts != BTH_POWER_OFF ){ //接続状態を判定して、トグルする BthSetMode(BTH_POWER_OFF); } else { BthSetMode(BTH_CONNECTABLE); } return 0; //成功 } //----- Worker Thread (for bTON) DWORD WINAPI BtSetMode_discover_Thread( IN LPVOID pParam ){ if ( g_btcon_sts == BTH_DISCOVERABLE ){ //発見可能状態を判定して、トグルする BthSetMode(BTH_CONNECTABLE); } else { BthSetMode(BTH_DISCOVERABLE); } return 0; //成功 } //----- TimerEvent function ----- //----- AtokChanger LOOP static void AtokChanger(){ DWORD dwStatus22; DWORD dwStatus31; DWORD dwConv; //IMM文字種 DWORD dwSent; //現在の変換モード static DWORD dwStatus22_old=8; static DWORD dwConv_old=0; //★ static DWORD dwSent_old=0; DWORD dr; //現在画面判定値 DWORD dwX =0; DWORD dwY =0; if ((timeGetTime() - nTime) < 200){ //----- if ( g_log ){ //デバッグログ用 SYSTEMTIME time; GetLocalTime(&time); FILE *flog; flog = fopen( "\\atoksetp.txt" , "a" ); fprintf(flog , "%2d:%2d:%2d " ,time.wHour,time.wMinute,time.wSecond); fprintf(flog , "AC skip\n" ); fclose(flog); } //----- return; //loop対策 } dwStatus22 = GetRegDW( 1 , SZ_REG_RT_PS , SZ_REG_KY_PS22 ); dwStatus22 = dwStatus22 & 0x07; ImmGetConversionStatus(NULL, &dwConv, &dwSent); if ( dwStatus22_old != dwStatus22 || dwConv_old != dwConv || dwSent_old != dwSent ){ //文字種か変換モードが変わっている★ dwStatus31 = GetRegDW( 1 , SZ_REG_RT_PS , SZ_REG_KY_PS31 ); //ATOK変換候補の場合は除外する dwStatus31 = dwStatus31 & 0x07; if ( dwStatus31 !=0 && dwStatus22 == 7 ) return; dwStatus22_old = dwStatus22; dwConv_old = dwConv; //★ dwSent_old = dwSent; if ( g_rotation_kb ){ //KB指定があれば、キーボード開閉、なければ、画面縦横を画面方向判定にセット★1 dr = g_KB_open; } else { dwX = GetSystemMetrics(SM_CXSCREEN); dwY = GetSystemMetrics(SM_CYSCREEN); if ( dwX < dwY ){ dr = 0; } else { dr = 1; } } immSet( dwStatus22 , dr , dwConv , dwSent ); //----- if ( g_log ){ //デバッグログ用 SYSTEMTIME time; GetLocalTime(&time); FILE *flog; flog = fopen( "\\atoksetp.txt" , "a" ); fprintf(flog , "%2d:%2d:%2d " ,time.wHour,time.wMinute,time.wSecond); fprintf(flog , "AC:PS22=%d\n" ,dwStatus22); fclose(flog); } //----- } } //----- AtokSet LOOP static void AtokSet(){ int i = 0; HWND hWnd= NULL; DWORD dr_now; //現在画面方向 DWORD dwX =0; DWORD dwY =0; DWORD dr =0; //画面方向(最新) DWORD kb =0; //KB開閉(最新) DWORD dwConv; //IMM文字種 DWORD dwSent; //現在の変換モード static wchar_t classText[64+1] = L""; //現在のクラス名 static wchar_t titleText[64+1] = L""; //現在のWindowタイトル static int wait_settime; static int set_time_old= 0; static DWORD dr_old = 0; static DWORD kb_old = 0; static HWND hWnd_old = NULL; wchar_t sz[60] = L""; //現在時刻の取得 SYSTEMTIME time; GetLocalTime(&time); int set_time =time.wMilliseconds + time.wSecond*1000 + time.wMinute*60000 + time.wHour*3600000; //現在画面方向の取得 dwX = GetSystemMetrics(SM_CXSCREEN); dwY = GetSystemMetrics(SM_CYSCREEN); if ( dwX < dwY ){ dr = 0; } else { dr = 1; } //キーボードopen取得 kb = g_KB_open; //現在前面Window情報の取得 hWnd = GetForegroundWindow(); //前面Windowか、画面方向か、KB状態が変わっている if ( hWnd != hWnd_old || dr != dr_old || kb != kb_old){ if (dr != dr_old || kb != kb_old){ //wait追加 wait_settime = AS_waittime + AS_waittimeDR; } else { wait_settime = AS_waittime; } //切り替わった状態を退避 GetClassName (hWnd, classText, 64); GetWindowText(hWnd, titleText, 64); set_time_old = set_time; dr_old = dr; kb_old = kb; hWnd_old = hWnd; } //切替から一定時間の間は強制変更を行う if ( abs ( set_time - set_time_old ) < wait_settime ) { if ( g_rotation_kb ){ //KB指定があれば、キーボード開閉、なければ、画面縦横を画面方向判定にセット★1? dr_now = kb; } else { dr_now = dr; } i = 0; while( i < AS_iniCnt ){ if ((wcscmp(AS_ini_class[i],L"-")==0 || wcsstr(classText,AS_ini_class[i])!=NULL) && (wcscmp(AS_ini_title[i],L"-")==0 || wcsstr(titleText,AS_ini_title[i])!=NULL) && (AS_ini_dr[i]==2 || AS_ini_dr[i]==dr_now)) break; //default設定行が見つかった i++; } if ( i < AS_iniCnt && AS_ini_dwset[i] < 8 ){ if ((timeGetTime() - nTime) > 200){ ImmGetConversionStatus(NULL, &dwConv, &dwSent); immSet( AS_ini_dwset[i] , dr_now , dwConv , dwSent ); } RegSet( AS_ini_dwset[i] , dr_now ); //一致するini設定があった->入力文字コードを変更 //----- if ( g_log ){ //デバッグログ用 SYSTEMTIME time; GetLocalTime(&time); FILE *flog; flog = fopen( "\\atoksetp.txt" , "a" ); fprintf(flog , "%2d:%2d:%2d " ,time.wHour,time.wMinute,time.wSecond); char m_Text[64+1]; wcstombs( m_Text , classText , 64 ); fprintf(flog , "AS:Class=%s" ,m_Text ); wcstombs( m_Text , titleText , 64 ); fprintf(flog , " title=%s" ,m_Text ); fprintf(flog , " PS22=%d\n" ,AS_ini_dwset[i]); fclose(flog); } //----- } if ( set_time_old == set_time && AS_ini_msg[i] != NULL && (AS_ini_dr[i]==2 || AS_ini_dr[i]==dr_now)){ //初回チェックでコマンド送信 wcscpy( sz , AS_ini_msg[i] ); token = wcstok( sz , L":" ); while ( token != NULL ){ // Sleep( 50 ); if ( _wtoi( token ) != 0 ) PostMessage( g_hWndMy, WM_COMMAND, _wtoi( token ), 0); token = wcstok( NULL , L":" ); } } } } //----- ChgSuisoku LOOP static void ChgSuisoku(){ HKEY hKey; DWORD dr; //現在画面判定値 DWORD dwLastUpdate = 0; DWORD dwX =0; DWORD dwY =0; static DWORD dr_old = 2; if ( g_rotation_kb ){ //KB指定があれば、キーボード開閉、なければ、画面縦横を画面方向判定にセット dr = g_KB_open; } else { dwX = GetSystemMetrics(SM_CXSCREEN); dwY = GetSystemMetrics(SM_CYSCREEN); if ( dwX < dwY ){ dr = 0; } else { dr = 1; } } if ( dr_old != dr || !g_CS_on ){ //dr変更、CS停止時、いずれかのタイミングで設定を行う //----- if ( g_log ){ //デバッグログ用 SYSTEMTIME time; GetLocalTime(&time); FILE *flog; flog = fopen( "\\atoksetp.txt" , "a" ); fprintf(flog , "%2d:%2d:%2d " ,time.wHour,time.wMinute,time.wSecond); fprintf(flog , "CS PS22=%d\n" ,GetRegDW( 1 , SZ_REG_RT_PS , SZ_REG_KY_PS22 )); fclose(flog); } //----- if ( !g_CS_on ) dr = 2; dr_old = dr; dwLastUpdate = GetRegDW( 1 , SZ_REG_RT_LU , SZ_REG_KY_LU ); dwLastUpdate++; if ( RegOpenKeyEx( HKEY_CURRENT_USER, SZ_REG_RT_CV, 0, KEY_ALL_ACCESS, &hKey ) == ERROR_SUCCESS ){ RegSetValueEx( hKey , SZ_REG_KY_CV , 0 , REG_DWORD, (CONST BYTE*)&CS_ini_conjevalid[dr], sizeof( CS_ini_conjevalid[dr] ) ); RegCloseKey( hKey ); } if ( RegOpenKeyEx( HKEY_CURRENT_USER, SZ_REG_RT_LN, 0, KEY_ALL_ACCESS, &hKey ) == ERROR_SUCCESS ){ RegSetValueEx( hKey , SZ_REG_KY_LN , 0 , REG_DWORD, (CONST BYTE*)&CS_ini_learn[dr], sizeof( CS_ini_learn[dr] ) ); RegCloseKey( hKey ); } if ( RegOpenKeyEx( HKEY_CURRENT_USER, SZ_REG_RT_LU, 0, KEY_ALL_ACCESS, &hKey ) == ERROR_SUCCESS ){ RegSetValueEx( hKey , SZ_REG_KY_LU , 0 , REG_DWORD, (CONST BYTE*)&dwLastUpdate, sizeof( dwLastUpdate ) ); RegCloseKey( hKey ); } ImmSetOpenStatus(NULL, FALSE); ImmSetOpenStatus(NULL, TRUE); } } //----- bTON LOOP static void bTON(){ //bt接続状態判定と、trayicon表示判定の両方を行う HWND hWnd; if ( g_BT_sts && g_BT_on ){ //BT処理有効ならば、BTアイコン変更判定をする BthGetMode( &g_btcon_sts ); //BT状態の取得(BTH_POWER_OFF,BTH_CONNECTABLE,BTH_DISCOVERABLE) if ( g_btcon_sts != g_btcon_sts_old ){ //状態が変わっている g_btcon_sts_old = g_btcon_sts; if ( g_btcon_sts == BTH_POWER_OFF ){ icdata.hIcon=g_hIcon_off; if (wcslen(g_bt_off_Path)){ //OFF時起動 if( wcsstr(g_bt_off_Path , L".exe") != NULL ){ CreateProc( g_bt_off_Path , NULL ); } else { lnkExec( g_bt_off_Path ); } } } else { icdata.hIcon=g_hIcon_on; if (wcslen(g_bt_on_Path)){ //ON時起動 if( wcsstr(g_bt_on_Path , L".exe") != NULL ){ CreateProc( g_bt_on_Path , NULL ); } else { lnkExec( g_bt_on_Path ); } } } Shell_NotifyIcon( NIM_MODIFY , &icdata ); } } if ( g_TI_sts ){ //trayicon表示判定 int i = 0; while( i < BT_iniCnt ){ //トレイアイコン表示可否判定 hWnd = FindWindowW( bt_ini_class[i] , bt_ini_title[i] ); if ( hWnd ){ if (g_bticon_sts) Shell_NotifyIcon(NIM_DELETE,&icdata); g_bticon_sts = FALSE; return; } i++; } if (!g_bticon_sts) Shell_NotifyIcon(NIM_ADD,&icdata); g_bticon_sts = TRUE; } } //----- WithATOK loop static void WithATOK(){ DWORD dwStatus22=0; DWORD dr; //現在画面方向 DWORD dwX =0; DWORD dwY =0; BOOL way; int i; int j; DWORD dwConv; //IMM文字種 DWORD dwSent; //現在の変換モード static DWORD dwStatus22_old=8; static DWORD dwStatus22_f=0; dwStatus22 = GetRegDW( 1 , SZ_REG_RT_PS , SZ_REG_KY_PS22 ); if ( (dwStatus22 & 0x01007) == 4103 || (dwStatus22_f & 0x01007) == 4103 ){ //ATOK変換候補の場合は除外する dwStatus22_f = dwStatus22; return; } else { dwStatus22_f = dwStatus22; } dwStatus22 = dwStatus22_f & 0x07; if ( dwStatus22_old != dwStatus22 ){ //入力文字種が変更されたら判定する way = TRUE; j = dwStatus22 - dwStatus22_old; if ( (j < 0 && -7 < j) || 6 < j ) way = FALSE; //変更方向判定 if ( g_rotation_kb ){ //KB指定があれば、キーボード開閉、なければ、画面縦横を画面判定にセット dr = g_KB_open; } else { dwX = GetSystemMetrics(SM_CXSCREEN); dwY = GetSystemMetrics(SM_CYSCREEN); if ( dwX < dwY ){ dr = 0; } else { dr = 1; } } if ( WA_iniCnt[dr] == 0 ) return; if ( way ){ //変更方向判定 i=0; //→ while( i < WA_iniCnt[dr] ){ //現在の入力文字種より大きい設定文字種を探す if ( dwStatus22 <= WA_ini_sts22[dr][i] ) break; //一致していても再設定必要なので、=も必要 i++; } if ( i == WA_iniCnt[dr] ) i = 0; //見つからなかったら戻す } else { //← i=WA_iniCnt[dr]-1; while( 0 <= i ){ if ( dwStatus22 >= WA_ini_sts22[dr][i] ) break; i--; } if ( i == -1 ) i = WA_iniCnt[dr]-1; //見つからなかったら戻す } //----- if ( g_log ){ //デバッグログ用 SYSTEMTIME time; GetLocalTime(&time); FILE *flog; flog = fopen( "\\atoksetp.txt" , "a" ); fprintf(flog , "%2d:%2d:%2d " ,time.wHour,time.wMinute,time.wSecond); fprintf(flog , "WA:PS22_old=%d PS22=%d PS22_set=%d\n" ,dwStatus22_old ,dwStatus22 ,WA_ini_sts22[dr][i]); fclose(flog); } //----- // if (dwStatus22 != WA_ini_sts22[dr][i] || !g_AC_sts || !g_AC_on || AC_on[dr]){ //異なる時(loop対策) or ACが停止している時のみセットしなおし // } if ((timeGetTime() - nTime) > 200){ nTime = timeGetTime(); //タイマーセット(loop対策) ImmGetConversionStatus(NULL, &dwConv, &dwSent); immSet( WA_ini_sts22[dr][i] , dr , dwConv , dwSent ); //ps22が変わったら無条件にIMMを設定(全角漏れ対処)、RegSetより前にするのはloop対策 } if (dwStatus22 != WA_ini_sts22[dr][i]) { //Skip要の時のみ(loop対策) RegSet( WA_ini_sts22[dr][i] , dr ); } dwStatus22_old = WA_ini_sts22[dr][i]; } } //----- WithATOK CALLBACK void ATOK_PS22_CALLBACK(HREGNOTIFY hNotify, DWORD dwUserData, const PBYTE pData, const UINT cbData){ if( g_WA_sts && g_WA_on ) WithATOK(); if( g_rotation_adeskb ) AdesKB(); } //----- WiTset LOOP static void WiTset(){ HWND hWnd; wchar_t classText[64+1] = L""; wchar_t titleText[64+1] = L""; static HWND hWnd_old; static wchar_t titleText_old[64+1] = L""; wchar_t modulePath[MAX_PATH]; DWORD lpdwProcessId; hWnd = GetForegroundWindow(); GetWindowText(hWnd, titleText, 64); if ( hWnd_old != hWnd || wcscmp(titleText_old,titleText) != 0 ){ //前面windowが変わっていたら、部分一致判定をする GetClassName (hWnd, classText, 64); GetWindowThreadProcessId( hWnd , &lpdwProcessId ); GetModuleFileName( HMODULE(lpdwProcessId) , modulePath , MAX_PATH ); int i = 0; while( i < WS_iniCnt ){ if ((wcscmp(WS_ini_class[i],L"-")==0 || wcsstr(classText,WS_ini_class[i])!=NULL) && (wcscmp(WS_ini_title[i],L"-")==0 || wcsstr(titleText,WS_ini_title[i])!=NULL) && (wcscmp(WS_ini_fpath[i],L"-")==0 || wcsstr(modulePath,WS_ini_fpath[i])!=NULL)) SetWindowText( hWnd , WS_ini_settitle[i] ); i++; } hWnd_old = hWnd; wcscpy( titleText_old , titleText ); } } //----- Windows ----- //----- WinMain ----- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow){ HWND hWnd; //ウィンドウハンドル HWND hMyWnd; //二重起動確認ウィンドウハンドル MSG msg; //MSG構造体 BOOL bRet; WNDCLASS wc; //WNDCLASS構造体 //Windowモードの二重起動チェック hMyWnd = FindWindowW( szClassName , szWindowTitle ); if( hMyWnd && ( wcsstr( lpCmdLine , L"R" ) == NULL) ){ if ( IDOK == MessageBox(NULL, L"AtokSetPlus exit ?", szMsgTitle, MB_OKCANCEL) ) PostMessage( hMyWnd, WM_COMMAND, M_APP_END, 0); //■終了する return 0; } //パス生成 GetModuleFileName(NULL, exePath, 256); //exeのフルパスを取得 wcscpy( iniPath , exePath ); int fLength = wcslen(iniPath); while(fLength--){//後ろから一番はじめの\を探す if(iniPath[fLength] == '\\') break; } iniPath[fLength] = '\0';//Null文字で'\\'ごとファイル名を消去 wcscat( iniPath, L"\\AtokSetP.ini");//文字列の最後尾に"\iniファイル"をつけ足す // スタートアップ登録用処理 if ( wcsstr(lpCmdLine , L"S") != NULL ){ Sleep(15000); //スタートアップ遅延用 } //ini file read wcstombs(fname, iniPath, 256); //iniファイル名をW->C変換 char s[128+2]; wchar_t sz[128+2]; DWORD sect = 0; FILE *fp; if ( (fp=fopen(fname,"r")) != NULL) { //iniファイルがあればread while ( fgets(s, 128+1, fp) != NULL ) { //行毎に読み込み MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,s,-1,sz,128+1); //M -> W if ( sz[wcslen(sz)-1] == '\n' ) sz[wcslen(sz)-1] = '\0'; //改行削除 if ( wcslen(sz) == 0 || sz[0] == '/') continue; //無効行SKIP if ( sz[0] == '['){ if ( wcscmp( sz , L"[trayicon]" ) ==0 ){ g_TI_sts = TRUE; sect = 1; continue; } if ( wcscmp( sz , L"[AtokChanger]" )==0 ){ g_AC_sts = TRUE; sect = 2; continue; } if ( wcscmp( sz , L"[AtokSet]" ) ==0 ){ g_AS_sts = TRUE; sect = 3; continue; } if ( wcscmp( sz , L"[ChgSuisoku]" ) ==0 ){ g_CS_sts = TRUE; sect = 4; continue; } if ( wcscmp( sz , L"[bTON]" ) ==0 ){ g_BT_sts = TRUE; sect = 5; continue; } if ( wcscmp( sz , L"[WithATOK]" ) ==0 ){ g_WA_sts = TRUE; sect = 6; continue; } if ( wcscmp( sz , L"[WiTset]" ) ==0 ){ g_WS_sts = TRUE; sect = 7; continue; } } switch(sect){ case 0: common_iniRead( sz ); break; case 1: trayicon_iniRead( sz ); break; case 2: Atokchanger_iniRead( sz ); break; case 3: AtokSet_iniRead( sz ); break; case 4: ChgSuisoku_iniRead( sz ); break; case 5: bTON_iniRead( sz ); break; case 6: WithATOK_iniRead( sz ); break; case 7: WiTset_iniRead( sz ); break; } } fclose( fp ); } if (!sect){ MessageBox(NULL, L"INI file setting ERROR", szMsgTitle, MB_OK); return 0; } //Create Instance & Window if (!hPrevInstance){ wc.style = CS_HREDRAW | CS_VREDRAW; //クラススタイル wc.lpfnWndProc = (WNDPROC) WndProc; //Windowプロシージャ wc.cbClsExtra = 0; //補足メモリブロックサイズ wc.cbWndExtra = 0; //補足メモリブロックサイズ wc.hInstance = hInstance; //インスタンス g_hInstance = hInstance; wc.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1)); //アイコン g_hIcon_atok = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1)); g_hIcon_on = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON2)); g_hIcon_off = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON3)); // wc.hCursor = LoadCursor(NULL, IDC_ARROW); //カーソル wc.hCursor = NULL; wc.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH); //背景色 wc.lpszMenuName = NULL; //メニュー wc.lpszClassName= szClassName; //クラス名 if ( !RegisterClass( &wc ) ) return 0; //RegisterClass関数でWNDCLASS構造体を登録する } hWnd = CreateWindow( szClassName, //クラス名 szWindowTitle, //ウィンドウ名 WS_VISIBLE, //スタイル CW_USEDEFAULT, //横位置 CW_USEDEFAULT, //縦位置 CW_USEDEFAULT, //横幅 CW_USEDEFAULT, //縦幅 NULL, //親ウィンドウハンドル NULL, //子ウィンドウID hInstance, //インスタンスハンドル NULL); //作成データ if ( g_nobar ) delete_atokbar( hWnd ); //文字切替バーの非表示処理 ShowWindow( hWnd, //ウィンドウハンドル SW_HIDE ); //MSG loop while( ( bRet = GetMessage( &msg , NULL , 0 , 0 ) ) != 0 ) { if ( bRet == -1 ){ //handle the error and possibly exit return 0; } else { TranslateMessage( &msg ); DispatchMessage ( &msg ); } } return 0; } //----- WndProc ----- LRESULT CALLBACK WndProc( HWND hWnd , UINT msg , WPARAM wParam , LPARAM lParam ){ HMENU hM; HMENU hMenu; HANDLE hThread_BT; DWORD dwThreadID; int wmId; //WM_COMMAND ID int wmEvent; //WM_COMMAND EVENT static BOOL reset_sts = FALSE; static HANDLE hEvent; //キーボード監視スレッド終了イベント static HANDLE hThread_KB[2]; // キーボード監視スレッドハンドル static HREGNOTIFY hNotify = NULL; HINSTANCE hLib; static REGNOTIFYCB f_RegistryNotifyCallback; static REGNOTIFYCL f_RegistryCloseNotification; switch( msg ){ case WM_CREATE: g_hWndMy = hWnd; hLib = LoadLibrary(L"\\Windows\\aygshell.dll"); //dllをロード f_RegistryNotifyCallback = (REGNOTIFYCB)GetProcAddress(hLib, L"RegistryNotifyCallback"); //APIのアドレスを取得 f_RegistryCloseNotification = (REGNOTIFYCL)GetProcAddress(hLib, L"RegistryCloseNotification"); //トレイアイコン生成 icdata.cbSize=sizeof(NOTIFYICONDATA); //バイト単位で、この構造体のサイズ icdata.hWnd=hWnd; //メッセージ通知を受け取るウィンドウへのハンドル icdata.uID=6000; //アイコンの識別子。 値 0 〜 12 は予約いて使用できません icdata.uFlags=NIF_ICON | NIF_MESSAGE ; //格納フラグ icdata.uCallbackMessage=WM_USER; //メッセージ識別子 if ( g_BT_sts ){ icdata.hIcon=g_hIcon_off;//アイコンを識別するハンドル } else { icdata.hIcon=g_hIcon_atok; } if ( g_TI_sts ) Shell_NotifyIcon( NIM_ADD , &icdata ); g_bticon_sts = TRUE; g_btcon_sts = BTH_POWER_OFF; g_btcon_sts_old = BTH_POWER_OFF; if ( g_rotation_kb ){ //KB監視要 if ( g_rotation_adeskb ){ AdesKB(); } else { if ( !BeginSlideKeybd(&hWnd, &hEvent, hThread_KB) ){ //KB監視スレッド開始 MessageBox(NULL, L"KBcheck set error.", szMsgTitle, MB_OK); g_rotation_kb = FALSE; } } } if ((*f_RegistryNotifyCallback)(HKEY_CURRENT_USER,SZ_REG_RT_PS,SZ_REG_KY_PS22,ATOK_PS22_CALLBACK,0,NULL,&hNotify) != S_OK) MessageBox(NULL, L"ERROR RegistryNotifyCallback", szMsgTitle, MB_OK); //タイマーイベント生成 if( g_AC_sts ) SetTimer(hWnd , TM_ATOKCHANGER, AC_loopwait , NULL); if( g_AS_sts ) SetTimer(hWnd , TM_ATOKSET , AS_loopwait , NULL); if( g_BT_sts || g_TI_sts ) SetTimer(hWnd , TM_BTON , BT_loopwait , NULL); if( g_CS_sts ) SetTimer(hWnd , TM_CHGSUISOKU , CS_loopwait , NULL); if( g_WS_sts ) SetTimer(hWnd , TM_WITSET , WS_loopwait , NULL); break; case WM_CLOSE: //WM_CLOSEをスルー break; case WM_COMMAND: //メニュー処理 wmId = LOWORD( wParam ); wmEvent = HIWORD( wParam ); switch (wmId){ //----- menu item case M_CTLPANEL: CreateProc( L"\\Windows\\ctlpnl.exe" , L"\\Windows\\cplmain.cpl,23" ); break; case M_CONNECTABLE: if( g_BT_sts && g_BT_on ){ hThread_BT = CreateThread( NULL, 0, BtSetMode_connect_Thread, 0, 0, &dwThreadID ); //CreateThread WaitForSingleObject ( hThread_BT, 200 ); //Timeout 200ms CloseHandle( hThread_BT ); } break; case M_DISCOVERABLE: if( g_BT_sts && g_BT_on ){ hThread_BT = CreateThread( NULL, 0, BtSetMode_discover_Thread, 0, 0, &dwThreadID ); //CreateThread WaitForSingleObject ( hThread_BT, 200 ); //Timeout 200ms CloseHandle( hThread_BT ); } break; case M_ATOKCHANGER: if( g_AC_on ){ PostMessage( hWnd, WM_COMMAND, M_ATOKCHANGER_OFF, 0); } else { PostMessage( hWnd, WM_COMMAND, M_ATOKCHANGER_ON , 0); } break; case M_ATOKSET: if( g_AS_on ){ PostMessage( hWnd, WM_COMMAND, M_ATOKSET_OFF, 0); } else { PostMessage( hWnd, WM_COMMAND, M_ATOKSET_ON , 0); } break; case M_CHGSUISOKU: if( g_CS_on ){ PostMessage( hWnd, WM_COMMAND, M_CHGSUISOKU_OFF, 0); } else { PostMessage( hWnd, WM_COMMAND, M_CHGSUISOKU_ON , 0); } break; case M_BTON: //メニューとBTアイコンの表示を切替える、BT状態は変わらない // if ( g_TI_sts && g_BT_on ){ if ( g_BT_on ){ PostMessage( hWnd, WM_COMMAND, M_BTON_OFF, 0); } else { PostMessage( hWnd, WM_COMMAND, M_BTON_ON , 0); } break; case M_WITHATOK: if( g_WA_on ){ PostMessage( hWnd, WM_COMMAND, M_WITHATOK_OFF, 0); } else { PostMessage( hWnd, WM_COMMAND, M_WITHATOK_ON , 0); } break; case M_WITSET: if( g_WS_on ){ PostMessage( hWnd, WM_COMMAND, M_WITSET_OFF, 0); } else { PostMessage( hWnd, WM_COMMAND, M_WITSET_ON , 0); } break; //----- on(非メニュー) case M_ATOKCHANGER_ON: if( g_AC_sts && !g_AC_on ){ g_AC_on = TRUE; SetTimer(hWnd , TM_ATOKCHANGER, AC_loopwait , NULL); } break; case M_ATOKSET_ON: if( g_AS_sts && !g_AS_on ){ g_AS_on = TRUE; SetTimer(hWnd , TM_ATOKSET , AS_loopwait , NULL); } break; case M_WITHATOK_ON: if( g_WA_sts && !g_WA_on ){ g_WA_on = TRUE; } break; case M_WITSET_ON: if( g_WS_sts && !g_WS_on ){ g_WS_on = TRUE; SetTimer(hWnd , TM_WITSET , WS_loopwait , NULL); } break; case M_BTON_ON: //メニューとBTアイコンの表示を切替える、BT状態は変わらない // if( g_TI_sts && g_BT_sts && !g_BT_on ){ if( g_BT_sts && !g_BT_on ){ g_BT_on = TRUE; if( g_TI_sts ){ icdata.hIcon=g_hIcon_off; Shell_NotifyIcon( NIM_MODIFY , &icdata ); } g_btcon_sts = BTH_POWER_OFF; //icon更新の為、リセットする g_btcon_sts_old = BTH_POWER_OFF; SetTimer(hWnd , TM_BTON , BT_loopwait , NULL); } break; case M_CHGSUISOKU_ON: if( g_CS_sts && !g_CS_on ){ g_CS_on = TRUE; SetTimer(hWnd , TM_CHGSUISOKU , CS_loopwait , NULL); } break; //----- off(非メニュー) case M_ATOKCHANGER_OFF: if( g_AC_sts && g_AC_on ){ KillTimer(hWnd, TM_ATOKCHANGER); g_AC_on = FALSE; } break; case M_ATOKSET_OFF: if( g_AS_sts && g_AS_on ){ KillTimer(hWnd, TM_ATOKSET); g_AS_on = FALSE; } break; case M_WITHATOK_OFF: if( g_WA_sts && g_WA_on ){ g_WA_on = FALSE; } break; case M_WITSET_OFF: if( g_WS_sts && g_WS_on ){ KillTimer(hWnd, TM_WITSET); g_WS_on = FALSE; } break; case M_BTON_OFF: //メニューとBTアイコンの表示を切替える、BT状態は変わらない // if( g_TI_sts && g_BT_sts && g_BT_on ){ if( g_BT_sts && g_BT_on ){ if( g_TI_sts ){ icdata.hIcon=g_hIcon_atok; Shell_NotifyIcon( NIM_MODIFY , &icdata ); } else { KillTimer(hWnd, TM_BTON); } g_BT_on = FALSE; } break; case M_CHGSUISOKU_OFF: if( g_CS_sts && g_CS_on ){ KillTimer(hWnd, TM_CHGSUISOKU); g_CS_on = FALSE; ChgSuisoku(); //元状態に戻す } break; //----- others case M_INIOPEN: lnkExec( iniPath ); break; case M_RESET: reset_sts = TRUE; PostMessage( hWnd, WM_COMMAND, M_APP_END, 0); //■終了する break; case M_EXIT: KillTimer(hWnd, TM_ATOKCHANGER); KillTimer(hWnd, TM_ATOKSET); KillTimer(hWnd, TM_BTON); KillTimer(hWnd, TM_CHGSUISOKU); KillTimer(hWnd, TM_WITSET); if ( IDOK == MessageBox(NULL, L"AtokSetPlus exit ?", szMsgTitle, MB_OKCANCEL) ){ PostMessage( hWnd, WM_COMMAND, M_APP_END, 0); //■終了する break; } if( g_AC_sts ) SetTimer(hWnd , TM_ATOKCHANGER, AC_loopwait , NULL); if( g_AS_sts ) SetTimer(hWnd , TM_ATOKSET , AS_loopwait , NULL); if( g_BT_sts || g_TI_sts ) SetTimer(hWnd , TM_BTON , BT_loopwait , NULL); if( g_CS_sts ) SetTimer(hWnd , TM_CHGSUISOKU , CS_loopwait , NULL); if( g_WS_sts ) SetTimer(hWnd , TM_WITSET , WS_loopwait , NULL); break; case M_APP_END: //■終了処理実体、MSGループを抜ける KillTimer(hWnd, TM_ATOKCHANGER); KillTimer(hWnd, TM_ATOKSET); KillTimer(hWnd, TM_BTON); KillTimer(hWnd, TM_CHGSUISOKU); g_CS_on = FALSE; ChgSuisoku(); //元状態に戻す KillTimer(hWnd, TM_WITSET); (*f_RegistryCloseNotification)(hNotify); //通知Notyfe削除 EndSlideKeybd(&hEvent, hThread_KB); //KB監視スレッド停止 if ( g_TI_sts ) Shell_NotifyIcon(NIM_DELETE,&icdata); if(hWndAtok) SetWindowPos(hWndAtok, NULL, rc.left, rc.top, rc.right, rc.bottom+rc_bottom_adj, NULL); //文字入力バー戻し if ( reset_sts ) CreateProc( exePath , L"R" ); PostQuitMessage( 0 ); //WM_QUIT を送信 break; default: return DefWindowProc(hWnd, msg, wParam, lParam); } break; case WM_USER: //タスクトレイアイコンclick -> POPUP MENU生成 switch(lParam){ case WM_LBUTTONDOWN: BthGetMode( &g_btcon_sts ); //BTstatus Check(BTH_POWER_OFF,BTH_CONNECTABLE,BTH_DISCOVERABLE) SetForegroundWindow( hWnd ); hM = LoadMenu (g_hInstance, MAKEINTRESOURCE(IDR_MENUBAR1)); hMenu = GetSubMenu(hM, 0); if ( !g_BT_sts || !g_BT_on ){ DeleteMenu(hMenu , M_CONNECTABLE , MF_BYCOMMAND); DeleteMenu(hMenu , M_DISCOVERABLE, MF_BYCOMMAND); DeleteMenu(hMenu , M_CTLPANEL , MF_BYCOMMAND); } else { if (g_btcon_sts != BTH_POWER_OFF){ //BTH_CONNECTABLE or BTH_DISCOVERABLE CheckMenuItem(hMenu,M_CONNECTABLE,MF_BYCOMMAND|MF_CHECKED); } else { CheckMenuItem(hMenu,M_CONNECTABLE,MF_BYCOMMAND|MF_UNCHECKED); } if (g_btcon_sts == BTH_DISCOVERABLE){ //BTH_DISCOVERABLE CheckMenuItem(hMenu,M_DISCOVERABLE,MF_BYCOMMAND|MF_CHECKED); } else { CheckMenuItem(hMenu,M_DISCOVERABLE,MF_BYCOMMAND|MF_UNCHECKED); } } if ( !g_BT_sts ){ DeleteMenu(hMenu , M_BTON , MF_BYCOMMAND); } else { if ( g_BT_on ){ CheckMenuItem(hMenu,M_BTON,MF_BYCOMMAND|MF_CHECKED); } else { CheckMenuItem(hMenu,M_BTON,MF_BYCOMMAND|MF_UNCHECKED); } } if( !g_AC_sts ){ DeleteMenu(hMenu , M_ATOKCHANGER , MF_BYCOMMAND); } else { if ( g_AC_on ){ CheckMenuItem(hMenu,M_ATOKCHANGER,MF_BYCOMMAND|MF_CHECKED); } else { CheckMenuItem(hMenu,M_ATOKCHANGER,MF_BYCOMMAND|MF_UNCHECKED); } } if( !g_AS_sts ){ DeleteMenu(hMenu , M_ATOKSET , MF_BYCOMMAND); } else { if ( g_AS_on ){ CheckMenuItem(hMenu,M_ATOKSET,MF_BYCOMMAND|MF_CHECKED); } else { CheckMenuItem(hMenu,M_ATOKSET,MF_BYCOMMAND|MF_UNCHECKED); } } if( !g_CS_sts ){ DeleteMenu(hMenu , M_CHGSUISOKU , MF_BYCOMMAND); } else { if ( g_CS_on ){ CheckMenuItem(hMenu,M_CHGSUISOKU,MF_BYCOMMAND|MF_CHECKED); } else { CheckMenuItem(hMenu,M_CHGSUISOKU,MF_BYCOMMAND|MF_UNCHECKED); } } if( !g_WA_sts ){ DeleteMenu(hMenu , M_WITHATOK , MF_BYCOMMAND); } else { if ( g_WA_on ){ CheckMenuItem(hMenu,M_WITHATOK,MF_BYCOMMAND|MF_CHECKED); } else { CheckMenuItem(hMenu,M_WITHATOK,MF_BYCOMMAND|MF_UNCHECKED); } } if( !g_WS_sts ){ DeleteMenu(hMenu , M_WITSET , MF_BYCOMMAND); } else { if ( g_WS_on ){ CheckMenuItem(hMenu,M_WITSET,MF_BYCOMMAND|MF_CHECKED); } else { CheckMenuItem(hMenu,M_WITSET,MF_BYCOMMAND|MF_UNCHECKED); } } TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_BOTTOMALIGN, 10, GetSystemMetrics(SM_CYSCREEN)-30, 0, hWnd, NULL); DestroyMenu(hM); PostMessage(hWnd ,WM_NULL ,0 ,0); SetForegroundWindow( FindWindowW( L"DesktopExplorerWindow" , L"Desktop" ) ); } break; case WM_TIMER: switch(wParam) { case TM_ATOKCHANGER: AtokChanger(); break; case TM_ATOKSET: AtokSet(); break; case TM_CHGSUISOKU: ChgSuisoku(); break; case TM_BTON: bTON(); break; case TM_WITSET: WiTset(); break; } break; default: return( DefWindowProc( hWnd , msg , wParam , lParam ) ); //標準処理を実行 } return ( 0L ); }