cmd的使用問題 |
尚未結案
|
ericlwl
一般會員 發表:3 回覆:5 積分:1 註冊:2003-10-26 發送簡訊給我 |
|
ericlwl
一般會員 發表:3 回覆:5 積分:1 註冊:2003-10-26 發送簡訊給我 |
我自己想到了一個暫時的解法,但是不滿意,不知有沒有人可以分享一下。
以下是我的暫時解法:(很笨的方法)
main() { RunProcess("cmd.exe /c", password); } RunProcess(char *CommandLine, char password[10]) { int i, charnum; STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); si.wShowWindow = SW_HIDE; // Start the child process. if( CreateProcess( NULL,CommandLine,NULL,NULL,FALSE,0,NULL, NULL, &si, &pi) != 0) { if( strlen(password) > 3 ) { WaitForSingleObject( pi.hProcess, 5000 ); for( i = 0; i < strlen(password); i ) { password[i] = toupper(password[i]); charnum = password[i]; keybd_event(charnum, 0, 0, 0); keybd_event(charnum, 0, KEYEVENTF_KEYUP, 0); } keybd_event(13, 0, 0, 0); keybd_event(13, 0, KEYEVENTF_KEYUP, 0); } } // Wait until child process exits. WaitForSingleObject( pi.hProcess, INFINITE ); // Close process and thread handles. CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); } |
liangnet
中階會員 發表:19 回覆:148 積分:83 註冊:2004-01-03 發送簡訊給我 |
|
ericlwl
一般會員 發表:3 回覆:5 積分:1 註冊:2003-10-26 發送簡訊給我 |
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: 我自己想到了一個暫時的解法,但是不滿意,不知有沒有人可以分享一下。 以下是我的暫時解法:(很笨的方法)ericlwl你好: 過去我有一些由一隻 >!不曉得對你有沒有幫助! 就是一樣用>假設這隻被開啟的>,那之後對這隻>> 這裏其實問題滿大的,我用<>>確定其開啟,並<>完成開啟> <>> 一般用 >! 所以比較正確的方式應該是去列舉所有的視窗,當某一個視窗的 class="code"> EnumWindows((WNDENUMPROC)FindPrgmHwnd,(LPARAM)"TMForm"); bool __stdcall FindPrgmHwnd(HWND hnd,LPARAM lparam) { DWORD prssid=0; char clssnme[128]; ZeroMemory(clssnme,128); GetWindowThreadProcessId(hnd,&prssid); GetClassName(hnd,clssnme,128); if (prssid==PrssInf[PrssNum].dwProcessId && IsWindowVisible(hnd) && AnsiString(clssnme)==(LPTSTR)lparam) { HwndWeNeed=hnd; return false; } return true; } 嗯,在抓到這個AP MainForm的hwnd值後,就可以再求得其上面的子元件的hwnd值,並針對其中的子元件SendMessage去控制它了! ericlwl你的模擬鍵盤方式應該也ok,只是會有lose的風險吧,我想!而且>>後,這隻 class="code"> void __fastcall TForm1::FormCreate(TObject *Sender) { HWND hwnd=FindWindow(NULL,"命令提示字元"); SendMessage(hwnd,WM_CHAR,'a',0); <--送一個字元給dos視窗的C:\> } 當然FindWindow的使用風險也是同上的,就不再多說了! 發表人 -main() { RunProcess("cmd.exe /c", password); } RunProcess(char *CommandLine, char password[10]) { int i, charnum; STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); si.wShowWindow = SW_HIDE; // Start the child process. if( CreateProcess( NULL,CommandLine,NULL,NULL,FALSE,0,NULL, NULL, &si, &pi) != 0) { if( strlen(password) > 3 ) { WaitForSingleObject( pi.hProcess, 5000 ); for( i = 0; i < strlen(password); i ) { password[i] = toupper(password[i]); charnum = password[i]; keybd_event(charnum, 0, 0, 0); keybd_event(charnum, 0, KEYEVENTF_KEYUP, 0); } keybd_event(13, 0, 0, 0); keybd_event(13, 0, KEYEVENTF_KEYUP, 0); } } // Wait until child process exits. WaitForSingleObject( pi.hProcess, INFINITE ); // Close process and thread handles. CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); } |
ericlwl
一般會員 發表:3 回覆:5 積分:1 註冊:2003-10-26 發送簡訊給我 |
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: m8815010你好: 先謝謝你讓我多學了一個方法,但因為學藝不精看不太懂列舉視窗的方法,而我在執行程式時會開啟不只一個的cmd視窗,所以....。而且我是用>>這一行的問題,其實也困擾著我,因為,我本來想隱藏視窗,但不知怎麼的都無法隱藏,所以,其實那一行目前等於沒作用(我猜可能是>>< face="Verdana, Arial, Helvetica"> ericlwl你好< >: 忘了回應你的題目了< >! 1. 嗯列舉視窗的目的只是要找出我們要通訊的那隻ap為何!如前例假設我們要開起一個NotePad,並和它通訊,那麼同一時間系統可能還有與許多的NotePad也是開啟的,所以必須先確定我們不會和錯的NotePad通訊! 而視窗handle值和process id值即是用來辨別它們的方式! 列舉的方式也就是窮舉,是因為我們不知如何直接找出我們要的那個視窗的handle值,所以這列舉也不是高招!仍有改善空間! >! class="code"> void __fastcall TForm1::Timer1Timer(TObject *Sender) { HWND hwnd=FindWindow(NULL,"要找的視窗caption名稱"); if (hwnd!=NULL) ShowMessage("找到了!"); } 嗯,隨便舉的爛招!當然好像也有視窗handle值不好找的經驗: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=44630 4. hide的問題,嗯....我們也是遇到過,忘了當時有沒有找到原因,只計得最後是開啟後再用ShowWindow等等的function再把這隻ap hide起來! 一點點淺見,希望有小小的助益! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |