/* kanamenu.c Borland C++ 5.5.1 bcc32 -tW -w-8057 -w-8065 kanamenu.c brc32 -iC:\borland\bcc55\Include kanamenu.rc 謎@1 メニューの返り値が変になることがある。例 tをクリックしてmilyaになったりする。 ver 0.0 2003年04月25日(金) ver 1.0 2003年05月17日(土) clip_flg追加。 2003年05月24日(土) ver 1.1 2003年05月24日(土) arg_flgの時のclip_flgの不具合を修正 2003年06月30日(月) [:]の機能を追加 2003年06月30日(月) [!&〜]の機能を追加 2003年07月04日(金) ver 1.2 2003年07月04日(金) KURIKAESHI指定 2003年09月21日(日)  直前の一文字を繰り返し [Tab][*3]や[Ctrl][Tab][*2]など kanamenu.iniでのignore画面名指定 2003年10月24日(金) ignore = 指定画面名 好い加減に作ったので運用で注意。 表示域に簡単なテンキーボタン表示 2003年12月14日(日) さしあたって好い加減に作成 [wait 画面タイトル名] 2004年03月17日(水) いまいち */ // k16.bmpはMuRICツールのsampleを雛型にしてk16.icoを作成した。 // そうしないとpaintでは色の数を合わせられない。 #include #include "kanamenu.h" #define B_SIZE 256 char spf_buf[B_SIZE]; // for sprintf int WAIT_TIME=200; int r_mode=1; // 1=ローマ字かな変換 2=かな入力 BOOL sending_flg=FALSE; BOOL enum_flg=FALSE; BOOL arg_flg=FALSE; BOOL btn_flg=FALSE;//button char *arg_line=NULL; BOOL show_flg=FALSE; BOOL clip_flg=FALSE; char *ignore_table[10]={ // かな漢字処理などのtargetにしてはいけない画面 "MSIME", // "MSIMEConv" "msime", // "msime98mode" NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL }; char ignore_buf[256]={0}; // kanamenu.iniに追加された画面名の格納エリア char *ignore_p=ignore_buf; // ----------------------------------------------------------------- #include // Required for the CreateProcess function #include // Required for the SendInput function #include // Required for the fopen function #if defined (WIN32) #define IS_WIN32 TRUE #else #define IS_WIN32 FALSE #endif #define IS_NT IS_WIN32 && (BOOL)(GetVersion() < 0x80000000) #define IS_WIN32S IS_WIN32 && (BOOL)(!(IS_NT) && (LOBYTE(LOWORD(GetVersion()))<4)) #define IS_WIN95 (BOOL)(!(IS_NT) && !(IS_WIN32S)) && IS_WIN32 HINSTANCE hInst; // アプリケーション内で使用するインスタンスハンドル BOOL RegisterWin95( CONST WNDCLASS* lpwc ); BOOL make_menu_main(HWND hWnd,char *filename); LPCTSTR lpszAppName = "kanamenu"; LPCTSTR lpszTitle = "かなメニュー"; HWND target_hWnd=NULL; // target window HWND kana_hWnd; // my kanamenu window HWND get_hWnd; // temporary GetForgroudWindow HWND hButton = NULL;// button #define LF_CODE 0x0a #define TAB_CODE 0x09 int btn_y=0; int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { MSG msg; HWND hWnd; WNDCLASS wc; int left,right,top,bot; int a1,a2,a3,a4; //MessageBox(NULL,lpCmdLine,"デバク文 --kanamenu--",MB_OK); /* { char *token; char *lp="-enum -t=123 dashj daj"; token=strtok(lp," "); while(token != NULL){ printf("token=%s\n",token); token=strtok(NULL," "); } } */ if(lpCmdLine != NULL){ char *p=lpCmdLine; while(*p != NULL){ if(strncmp(p,"-enum",5)==NULL){ enum_flg=TRUE; p+=5; if(*p==' ') p++; } else if(strncmp(p,"-t=",3)==NULL){ p+=3; if(atoi(p) !=0) WAIT_TIME=atoi(p); while(isdigit(*p))p++; if(*p==' ') p++; } else if(strncmp(p,"-clip",5)==NULL){ clip_flg=TRUE; p+=5; if(*p==' ') p++; } else if(strlen(p)>0){ arg_flg=TRUE; arg_line=p; break; } } } // アプリケーションのメインウィンドウのクラスを登録する //............................................ wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon( hInstance, lpszAppName ); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = lpszAppName; wc.lpszClassName = lpszAppName; if ( IS_WIN95 ) { if ( !RegisterWin95( &wc ) ) return( FALSE ); } else if ( !RegisterClass( &wc ) ) return( FALSE ); hInst = hInstance; { int i; FILE *fpi; a1= CW_USEDEFAULT; a2=0; a3= CW_USEDEFAULT; a4=0; //GetCurrentDirectory(B_SIZE,buf); if((fpi=fopen("kanamenu.ini","r"))!=NULL){ i=2; while(fgets(spf_buf,256,fpi) != NULL){ if(strncmp(spf_buf,"r_mode =",8)==0){ sscanf(spf_buf,"r_mode = %d", &r_mode); if(2style; wcex.lpfnWndProc = lpwc->lpfnWndProc; wcex.cbClsExtra = lpwc->cbClsExtra; wcex.cbWndExtra = lpwc->cbWndExtra; wcex.hInstance = lpwc->hInstance; wcex.hIcon = lpwc->hIcon; wcex.hCursor = lpwc->hCursor; wcex.hbrBackground = lpwc->hbrBackground; wcex.lpszMenuName = lpwc->lpszMenuName; wcex.lpszClassName = lpwc->lpszClassName; // Windows 95用に追加された要素 //............................... wcex.cbSize = sizeof(WNDCLASSEX); wcex.hIconSm = LoadImage(wcex.hInstance, lpwc->lpszClassName, IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR ); // RegisterClassEXはタイトルバーに表示されるアイコンの登録ができる。 return RegisterClassEx( &wcex ); } BOOL CALLBACK EnumWndProc( HWND hWnd, LPARAM lParam ) { static char szWindowName[71]; static char szClassName[31]; static char szAddString[101]; // ウィンドウの名前とクラス名を取得する。 //................................... GetWindowText( hWnd, szWindowName, 70 ); GetClassName( hWnd, szClassName, 30 ); // 文字列を作成し、リストボックスに追加する。 //........................................... if(IsWindowVisible(hWnd)) wsprintf( szAddString, "* %s - %s", szClassName, szWindowName ); else wsprintf( szAddString, "%s - %s", szClassName, szWindowName ); SendMessage( (HWND)lParam, LB_INSERTSTRING, (WPARAM)-1, (LPARAM)(LPTSTR)szAddString ); // 2003年04月02日(水) // ここに以下の処理を追加 // szClassNameにNotepadあるか あれば、そこにSendMessageする。 //if(strncmp("WordPadClass",szClassName,7)==0){ if(strncmp("Notepad",szClassName,7)==0){ //if(strncmp("msime98",szClassName,6)==0){ //if(strncmp("JVim",szClassName,4)==0){ target_hWnd=hWnd; } return( TRUE ); } LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { static HWND hListBox; switch( uMsg ) { case WM_CREATE : if(enum_flg){ hListBox = CreateWindow( "LISTBOX", "", WS_CHILD | WS_BORDER | WS_VISIBLE | LBS_STANDARD, 10, 10, 250, 100, hWnd, (HMENU) 101, hInst, NULL ); } break; case WM_COMMAND : switch( LOWORD( wParam ) ) { case IDM_TEST : //GetWindowText( target_hWnd, spf_buf, 70 ); //MessageBox( NULL, spf_buf, "Next Window",MB_OK ); /* Input Method Editorというのを、どうも勘違いしたようだ。 { DWORD lpfdwConversion=0; DWORD lpfdwSentence=0 ; HIMC t_hImc; if((t_hImc= ImmGetContext(target_hWnd))!=NULL){ ImmGetConversionStatus(t_hImc,&lpfdwConversion, &lpfdwSentence ); wsprintf(spf_buf, "%x %x",lpfdwConversion, lpfdwSentence ); MessageBox(NULL,spf_buf,"デバク文 --kanamenu--",MB_OK); ImmReleaseContext(target_hWnd,t_hImc); } } */ if(enum_flg){ EnumWindows((WNDENUMPROC)EnumWndProc, (LPARAM)(HANDLE)hListBox ); } else { ajust_window(); } break; case IDM_ABOUT : DialogBox( hInst, "AboutBox", hWnd, (DLGPROC)About ); break; case IDM_EXIT : DestroyWindow( hWnd ); break; case IDM_BTN : // button btn_flg=TRUE; hButton=(HWND)lParam; default: if(!arg_flg) send_main(hWnd,wParam); // call SendInput main } break; case WM_SIZE: switch( LOWORD( wParam ) ) { case SIZE_MAXIMIZED: show_flg=TRUE; show_bmp(kana_hWnd); // なんか不安定 Sleep(WAIT_TIME*5); // mill seconds send_ALT_F(); break; case SIZE_RESTORED: show_bmp(kana_hWnd); // なんか不安定 send_ALT_F(); break; } break; case WM_ACTIVATE: switch( LOWORD( wParam ) ) { case WA_ACTIVE: { // I am active,then get target_hWnd if(sending_flg==FALSE) { int i,j; BOOL pass=FALSE; target_hWnd = kana_hWnd; for( i=0; i0) break; } } return(buf); } char * pre_getline() { int i; while(TRUE){ if(fgets(pre_buf,B_SIZE,fp)==NULL) return(NULL); i=strlen(pre_buf); if(pre_buf[i-1]==LF_CODE) // けつっぺたの改行を消す。 pre_buf[--i]=NULL; if(strlen(pre_buf)>0) break; } return(pre_buf); } BOOL make_menu_main(HWND hWnd,char *filename) { if((fp=fopen(filename,"r"))==NULL){ wsprintf(spf_buf, "%sファイルがないよ。", filename); MessageBox(NULL,spf_buf,"デバク文 --kanamenu--",MB_OK); return(FALSE); } make_menu(GetMenu(hWnd)); fclose(fp); return(TRUE); } make_menu(HMENU pMenu) // parent menu { HMENU sMenu; // sub menu for append char *p,*pre; int now_tab_count,next_tab_count; while((p=getline()) != NULL){ for(now_tab_count=0;*p==TAB_CODE;now_tab_count++,p++); // 次の行も先読みしてTAB_CODEの数(階層のレベル)を調べる。 pre=pre_getline(); for(next_tab_count=0;(pre!=NULL)&&(*pre==TAB_CODE); next_tab_count++,pre++); if(now_tab_count>=next_tab_count){ // 次のレベルがないので項目としてを作成 if(strcmp(p,"---")==0) // これはセパレーター AppendMenu(pMenu, MFT_SEPARATOR,item_counter++,p); else AppendMenu(pMenu, MF_STRING,item_counter++,p); if(now_tab_count>next_tab_count) return(next_tab_count); // この階層のメニューは終わりー。 } else if(now_tab_countnext_tab_count) return(next_tab_count); // この階層のメニューは終わりー。 } } return(0); } // ----------------------------------------------------------------- char kana_wo[]={VK_SHIFT ,'0' , 0}; // problems char *kana_table[][3]={ " ", " ", " ", "あ", "a", "3", "い", "i", "e", "う", "u", "4", "え", "e", "5", "お", "o", "6", "ヴ", "vu", "u@", "ぁ", "la", "#", "ぃ", "li", "E", "ぅ", "lu", "$", "ぇ", "le", "%", "ぉ", "lo", "&", "か", "ka", "t", "き", "ki", "g", "く", "ku", "h", "け", "ke", ":", "こ", "ko", "b", "ヶ", "lke", "*", "が", "ga", "t@", "ぎ", "gi", "g@", "ぐ", "gu", "h@", "げ", "ge", ":@", "ご", "go", "b@", "さ", "sa", "x", "し", "si", "d", "す", "su", "r", "せ", "se", "p", "そ", "so", "c", "ざ", "za", "x@", "じ", "zi", "d@", "ず", "zu", "r@", "ぜ", "ze", "p@", "ぞ", "zo", "c@", "た", "ta", "q", "ち", "ti", "a", "つ", "tu", "z", "っ", "ltu", "Z", "て", "te", "w", "と", "to", "s", "だ", "da", "q@", "ぢ", "di", "a@", "づ", "du", "z@", "で", "de", "w@", "ど", "do", "s@", "な", "na", "u", "に", "ni", "i", "ぬ", "nu", "1", "ね", "ne", ",", "の", "no", "k", "は", "ha", "f", "ひ", "hi", "v", "ふ", "hu", "2", "へ", "he", "^", "ほ", "ho", "-", "ば", "ba", "f@", "び", "bi", "v@", "ぶ", "bu", "2@", "べ", "be", "^@", "ぼ", "bo", "-@", "ぱ", "pa", "f[", "ぴ", "pi", "v[", "ぷ", "pu", "2[", "ぺ", "pe", "^[", "ぽ", "po", "-[", "ま", "ma", "j", "み", "mi", "n", "む", "mu", "]", "め", "me", "/", "も", "mo", "m", "や", "ya", "7", "ゆ", "yu", "8", "よ", "yo", "9", "ゃ", "lya", "'", "ゅ", "lyu", "(", "ょ", "lyo", ")", "ら", "ra", "o", "り", "ri", "l", "る", "ru", ".", "れ", "re", ";", "ろ", "ro", "_", "わ", "wa", "0", "を", "wo", kana_wo, "ん", "n'", "y", "ー", "-", "|", /* !"#$%&'()=~| 1234567890-^\ `{ @[ +*} ;:] <>?_ ,./\ */ "!", "!", "", "”", "\"", "", "#", "#", "", "$", "$", "", "%", "%", "", "&", "&", "", "’", "'", "", "(", "(", "", ")", ")", "", "=", "=", "", "〜", "~", "", "|", "|", "", "1", "1", "", "2", "2", "", "3", "3", "", "4", "4", "", "5", "5", "", "6", "6", "", "7", "7", "", "8", "8", "", "9", "9", "", "0", "0", "", "−", "-", "", "^", "^", "", "¥", "\\", "", "‘", "`", "", "{", "{", "", "@", "@", "", "「", "[", "{", "+", "+", "", "*", "*", "", "}", "}", "", ";", ";", "", ":", ":", "", "」", "]", "}", "<", "<", "", ">", ">", "", "?", "?", "", "、", ",", "<", "。", ".", ">", "・", "/", "?", NULL,NULL,NULL, "", "", "_", // this is dangerous. NULL,NULL,NULL /* "", "", "", */ }; struct vk_tbl { char *p; int v; } vk_table[]={ {"[Esc]",VK_ESCAPE}, {"[半角/全角]",VK_KANJI}, {"[Tab]",VK_TAB}, {"[CapsLock]",VK_CAPITAL}, {"[Shift]",VK_SHIFT}, {"[Ctrl]",VK_CONTROL}, {"[Start]",VK_LWIN}, {"[Alt]",VK_MENU}, {"[無変換]",VK_NONCONVERT}, {"[SP]",VK_SPACE}, {"[Space]",VK_SPACE}, {"[変換]",VK_CONVERT}, {"[ひらがな]",VK_KANA}, {"[Print]",VK_PRINT}, {"[Enter]",VK_RETURN}, {"[Backspace]",VK_BACK}, {"[BS]",VK_BACK}, {"[PrintScreen]",VK_SNAPSHOT}, {"[Insert]",VK_INSERT}, {"[PageUp]",VK_PRIOR}, {"[PageDown]",VK_NEXT}, {"[Delete]",VK_DELETE}, {"[Home]",VK_HOME}, {"[End]",VK_END}, {"[←]",VK_LEFT}, {"[→]",VK_RIGHT}, {"[↑]",VK_UP}, {"[↓]",VK_DOWN}, {"[NumLock]",VK_NUMLOCK}, {"[F1]",VK_F1}, {"[F2]",VK_F2}, {"[F3]",VK_F3}, {"[F4]",VK_F4}, {"[F5]",VK_F5}, {"[F6]",VK_F6}, {"[F7]",VK_F7}, {"[F8]",VK_F8}, {"[F9]",VK_F9}, {"[F10]",VK_F10}, {"[F11]",VK_F11}, {"[F12]",VK_F12}, #define COMMAND 0x1001 #define ROMAJI 0x1002 #define KANAJI 0x1003 #define S_FLUSH 0x1004 #define S_FLUSH2 0x1005 #define VERSION 0x1006 #define EXIT 0x1007 #define KURIKAESHI 0x1008 #define WAIT_WND 0x1009 #define ATESAKI 0x100a {"[!",COMMAND}, // コマンド {"[as ローマ字かな入力]",ROMAJI}, // kanamenuへの特殊コマンド {"[as かな入力]",KANAJI}, // kanamenuへの特殊コマンド {"[;]",S_FLUSH}, // kanamenuへの特殊コマンド {"[:]",S_FLUSH2}, // kanamenuへの特殊コマンド {"[version]",VERSION}, // kanamenuへの特殊コマンド {"[exit]",EXIT}, // kanamenuへの特殊コマンド {"[*",KURIKAESHI}, // kanamenuへの特殊コマンド {"[wait ",WAIT_WND}, // kanamenuへの特殊コマンド //{"[>",ATESAKI}, // あて先指定 {NULL,NULL} }; // ----------------------------------------------------------------- BOOL menu_flg=FALSE; BOOL ctrl_flg=FALSE; BOOL shift_flg=FALSE; int pre_c; send_main( HWND hWnd, WPARAM wParam ) { char mbuf[B_SIZE]; char *p ,*p2; int i,l,j,l2; int k; BOOL pass=FALSE; BOOL gets; //MessageBox(NULL,mbuf,"デバク文-alt-",MB_OK); // table search sending_flg=TRUE; if(arg_flg) { p=arg_line; } else if(btn_flg){ //button GetWindowText( hButton, mbuf, B_SIZE ); btn_flg=FALSE; p=mbuf; } else { GetMenuString(GetMenu(hWnd), LOWORD( wParam ),mbuf, B_SIZE,MF_BYCOMMAND); p=mbuf; } if(clip_flg){ // クリップボードデータのレンダリング要求 HANDLE hMem; // クリップボードにストアするデータ LPVOID lpData; // データのアクセスポインタ char *lp; hMem = GlobalAlloc( GHND, B_SIZE ); lpData = GlobalLock( hMem ); lp=lpData ; while((*p)!=NULL){ gets=FALSE; for(i=0;vk_table[i].p != NULL;i++){ l=strlen(vk_table[i].p); if(strncmp(p,vk_table[i].p,l)==0){ if(vk_table[i].v == COMMAND){ // コマンド if((p2=strchr(p,']'))!=NULL){ p=p2+1; } else { (*lp++)=(*p++); } } else { p=p+l; } gets=TRUE; break; } } if(!gets){ (*lp++)=(*p++); } } OpenClipboard( hWnd ); EmptyClipboard( ); //lstrcpy( lpData, p ); SetClipboardData( CF_TEXT, hMem ); GlobalUnlock( hMem ); CloseClipboard( ); if(!arg_flg){ send_ALT_F(); } else { DestroyWindow( hWnd ); } return(0); } while((*p)!=NULL){ if(isascii(*p)){ gets=FALSE; // *p is [Alt] if(*p=='['){ for(i=0;vk_table[i].p != NULL;i++){ l=strlen(vk_table[i].p); if(strncmp(p,vk_table[i].p,l)==0){ //MessageBox(NULL,vk_table[i].p,"デバク文-alt-",MB_OK); if(vk_table[i].v == VK_MENU){ menu_flg=TRUE; p=p+l; } else if(vk_table[i].v == VK_CONTROL){ ctrl_flg=TRUE; p=p+l; } else if(vk_table[i].v == VK_SHIFT){ shift_flg=TRUE; p=p+l; } else if(vk_table[i].v == COMMAND){ // コマンド // [!C:\windows\calc.exe] if((p2=strchr(p,']'))!=NULL){ *p2=NULL; exec_cmd(p+2); *p2=']'; p=p2+1; } else { s_putc(VkKeyScan(*p)); p++; } } else if(vk_table[i].v == ROMAJI){ // 特殊コマンド r_mode=vk_table[i].v & 0xf; MessageBox(NULL,"ローマ字かな変換と承りました。", "デバク文 --kanamenu--",MB_OK); p=p+l; } else if(vk_table[i].v == KANAJI){ // 特殊コマンド r_mode=vk_table[i].v & 0xf; MessageBox(NULL,"かな入力と承りました。", "デバク文 --kanamenu--",MB_OK); p=p+l; } else if(vk_table[i].v == S_FLUSH){ // 特殊コマンド s_flush(); Sleep(WAIT_TIME); // mill seconds target_hWnd = kana_hWnd; for( j=0; j= (B_SIZE-8)) s_flush(); if((c & 0xff00)>0) { // --> VkKeyScan if(c & 0x400) // Alt menu_flg=TRUE; else if(c & 0x200) // Ctrl ctrl_flg=TRUE; else if(c & 0x100) // Shift shift_flg=TRUE; } pre_c=c; if(menu_flg){ ZeroMemory(&input[input_count], sizeof(INPUT)); input[input_count].type = INPUT_KEYBOARD; input[input_count].ki.wVk = VK_MENU; input_count++; pre_c=pre_c | 0x400; } if(ctrl_flg){ ZeroMemory(&input[input_count], sizeof(INPUT)); input[input_count].type = INPUT_KEYBOARD; input[input_count].ki.wVk = VK_CONTROL; input_count++; pre_c=pre_c | 0x200; } if(shift_flg){ ZeroMemory(&input[input_count], sizeof(INPUT)); input[input_count].type = INPUT_KEYBOARD; input[input_count].ki.wVk = VK_SHIFT; input_count++; pre_c=pre_c | 0x100; } ZeroMemory(&input[input_count], sizeof(INPUT)*2); input[input_count].type = INPUT_KEYBOARD; input[input_count].ki.wVk = c & 0xff; input_count++; input[input_count].type = INPUT_KEYBOARD; input[input_count].ki.wVk = c & 0xff; input[input_count].ki.dwFlags = KEYEVENTF_KEYUP; // THIS IS IMPORTANT input_count++; if(menu_flg){ ZeroMemory(&input[input_count], sizeof(INPUT)); input[input_count].type = INPUT_KEYBOARD; input[input_count].ki.wVk = VK_MENU; input[input_count].ki.dwFlags = KEYEVENTF_KEYUP; // THIS IS IMPORTANT input_count++; menu_flg=FALSE; } if(ctrl_flg){ ZeroMemory(&input[input_count], sizeof(INPUT)); input[input_count].type = INPUT_KEYBOARD; input[input_count].ki.wVk = VK_CONTROL; input[input_count].ki.dwFlags = KEYEVENTF_KEYUP; // THIS IS IMPORTANT input_count++; ctrl_flg=FALSE; } if(shift_flg){ ZeroMemory(&input[input_count], sizeof(INPUT)); input[input_count].type = INPUT_KEYBOARD; input[input_count].ki.wVk = VK_SHIFT; input[input_count].ki.dwFlags = KEYEVENTF_KEYUP; // THIS IS IMPORTANT input_count++; shift_flg=FALSE; } return(0); } s_flush() { if(input_count<=0) return(0); //MessageBox(NULL,"s_flush","デバク文-s_putc-",MB_OK); get_hWnd=GetForegroundWindow(); if(get_hWnd != target_hWnd){ SetForegroundWindow( target_hWnd ); } SendInput(input_count, input, sizeof(INPUT)); //{int t;for(t=0;t<0xffffff;t++);} Sleep(WAIT_TIME); // mill seconds input_count=0; return(0); } send_ALT_F(){ // send to me INPUT input1[4]; // ALT F for menu display down ZeroMemory(input1, sizeof(input1)); input1[0].type = input1[1].type = INPUT_KEYBOARD; input1[2].type = input1[3].type = INPUT_KEYBOARD; input1[0].ki.wVk = input1[3].ki.wVk = VK_MENU; input1[1].ki.wVk = input1[2].ki.wVk = 'F'; input1[2].ki.dwFlags = KEYEVENTF_KEYUP; // IMPORTANT input1[3].ki.dwFlags = KEYEVENTF_KEYUP; // IMPORTANT SendInput(4, input1, sizeof(INPUT)); return(0); } // ----------------------------------------------------------------- ajust_window() { WINDOWPLACEMENT wp; //int nCX = GetSystemMetrics(SM_CXSCREEN); //int nCY = GetSystemMetrics(SM_CYSCREEN); int nCX = GetSystemMetrics(SM_CXFULLSCREEN); int nCY = GetSystemMetrics(SM_CYFULLSCREEN); int nCCY= GetSystemMetrics(SM_CYCAPTION); int nCMY= GetSystemMetrics(SM_CYMENU); int nCEY= GetSystemMetrics(SM_CYEDGE); //wsprintf(spf_buf, "%d %d %d %d %d", nCX,nCY,nCCY,nCMY,nCEY); //MessageBox(NULL,spf_buf,"デバク文 --kanamenu--",MB_OK); // 640 480 19 19 2 wp.length = sizeof( WINDOWPLACEMENT ); // 構造体のサイズを初期化する。 if(GetWindowPlacement(target_hWnd,&wp)){ /* wsprintf( spf_buf, "left=%d,top=%d,right=%d,bot=%d", wp.rcNormalPosition.left, wp.rcNormalPosition.top, wp.rcNormalPosition.right, wp.rcNormalPosition.bottom ); MessageBox( NULL, spf_buf, "Window Position", MB_OK ); */ wp.rcNormalPosition.left=0; wp.rcNormalPosition.top=nCCY+nCMY+nCEY*2+btn_y; wp.rcNormalPosition.right=nCX; wp.rcNormalPosition.bottom=nCY+nCMY+nCEY*2; wp.showCmd=SW_SHOWNORMAL; SetWindowPlacement(target_hWnd,&wp); } SetWindowPos(kana_hWnd,NULL,0,0,nCX,nCCY+nCMY+nCEY*3+btn_y, SWP_SHOWWINDOW | SWP_NOZORDER); return(0); } // ----------------------------------------------------------------- exec_cmd(char *cmd_line) { BOOL wait_flg=TRUE; //cmd_line="C:\\windows\\calc.exe"; STARTUPINFO si; PROCESS_INFORMATION pi; TCHAR szBuffer[128]; int i; s_flush(); // 構造体の初期化 ZeroMemory( &si, sizeof(STARTUPINFO) ); ZeroMemory( &pi, sizeof(PROCESS_INFORMATION) ); si.cb=sizeof( STARTUPINFO ); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWNORMAL; //MS-DOSプロンプトに対しての文字入力できなーい。 if(strlen(cmd_line)==0){ // [!] is only wait /* たてこんぶ起動のようにMS-DOSバッチ画面が、IEの画面がでる前に消えてしまうと、 瞬間フォアに何か期待してない画面がでてしまうことがある。バッチ処理のほうで、 choiceなんかで、時間待ちして対応するしかない。 2003年05月07日(水) */ //SetPriorityClass( GetCurrentProcess(), IDLE_PRIORITY_CLASS ); for(i=0;i<(10000/WAIT_TIME);i++){ // 最大10秒待とう。 Sleep(WAIT_TIME); // mill seconds get_hWnd=GetForegroundWindow(); if(IsWindowVisible(get_hWnd)&& (get_hWnd != target_hWnd) && (get_hWnd != kana_hWnd)){ if(GetWindowText(target_hWnd,&spf_buf[128],70)==NULL) continue; target_hWnd=get_hWnd; break; } } Sleep(WAIT_TIME); // mill seconds //SetPriorityClass( GetCurrentProcess(), NORMAL_PRIORITY_CLASS ); } else { if(*cmd_line == '&'){ cmd_line++; wait_flg=FALSE; } if(CreateProcess(NULL,cmd_line,NULL, NULL, TRUE, //NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi )){ 0, NULL, NULL, &si, &pi )){ WaitForInputIdle( GetCurrentProcess(), INFINITE ); if(wait_flg){ for(i=0;i<(10000/WAIT_TIME);i++){ // 最大10秒待とう。 // 起動プロセスが入力待ちになったか判定するのが望ましい。 // 面倒くさいし、そこそこ動くので、まっいいや。 Sleep(WAIT_TIME); // mill seconds get_hWnd=GetForegroundWindow(); if(IsWindowVisible(get_hWnd)&& (get_hWnd != target_hWnd) && (get_hWnd != kana_hWnd)){ target_hWnd=get_hWnd; if(GetWindowText(target_hWnd,&spf_buf[128],70)==NULL) continue; wsprintf( spf_buf,"%s → %s", lpszTitle,&spf_buf[128]); SetWindowText(kana_hWnd,spf_buf); break; } } } //GetWindowText( target_hWnd, spf_buf, 70 ); //MessageBox( NULL, spf_buf, "Next Window",MB_OK ); //Sleep(WAIT_TIME); } else { wsprintf(spf_buf, "起動できまへん。%s", cmd_line); MessageBox(NULL,spf_buf,"デバク文 --kanamenu--",MB_OK); } } return(0); }