線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1892
推到 Plurk!
推到 Facebook!

cmd的使用問題

尚未結案
ericlwl
一般會員


發表:3
回覆:5
積分:1
註冊:2003-10-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-04-01 01:58:26 IP:61.218.xxx.xxx 未訂閱
我用createprocess開啟cmd並執行一程式,該程式執行過程中需要輸入密碼,有沒有什麼方式可以利用Form輸入的密碼,直接送給該程式使用,謝謝!! (該程式有提示字:'Enter PEM pass phrase:')
ericlwl
一般會員


發表:3
回覆:5
積分:1
註冊:2003-10-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-04-04 01:53:48 IP:61.218.xxx.xxx 未訂閱
我自己想到了一個暫時的解法,但是不滿意,不知有沒有人可以分享一下。 以下是我的暫時解法:(很笨的方法)    
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-04 08:10:19 IP:61.216.xxx.xxx 未訂閱
引言: 我用createprocess開啟cmd並執行一程式,該程式執行過程中需要輸入密碼,有沒有什麼方式可以利用Form輸入的密碼,直接送給該程式使用,謝謝!! (該程式有提示字:'Enter PEM pass phrase:')
也可以將密碼存成一個檔案來傳送給另一個程式。
ericlwl
一般會員


發表:3
回覆:5
積分:1
註冊:2003-10-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-04 08:51:42 IP:61.218.xxx.xxx 未訂閱
引言: 也可以將密碼存成一個檔案來傳送給另一個程式。
那個程式沒有辦法用引數或用檔案來傳遞密碼。
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-04-05 12:01:26 IP:61.63.xxx.xxx 未訂閱
引言: 我自己想到了一個暫時的解法,但是不滿意,不知有沒有人可以分享一下。 以下是我的暫時解法:(很笨的方法)
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你好: 過去我有一些由一隻 >!不曉得對你有沒有幫助! 就是一樣用>假設這隻被開啟的>,那之後對這隻>> 這裏其實問題滿大的,我用<>>確定其開啟,並<>完成開啟 <>> 一般用 >! 所以比較正確的方式應該是去列舉所有的視窗,當某一個視窗的 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的使用風險也是同上的,就不再多說了! 發表人 -
ericlwl
一般會員


發表:3
回覆:5
積分:1
註冊:2003-10-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-04-07 01:01:57 IP:61.218.xxx.xxx 未訂閱
m8815010你好: 先謝謝你讓我多學了一個方法,但因為學藝不精看不太懂列舉視窗的方法,而我在執行程式時會開啟不只一個的cmd視窗,所以....。而且我是用>>這一行的問題,其實也困擾著我,因為,我本來想隱藏視窗,但不知怎麼的都無法隱藏,所以,其實那一行目前等於沒作用(我猜可能是
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-04-09 00:21:19 IP:210.64.xxx.xxx 未訂閱
引言: 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起來! 一點點淺見,希望有小小的助益!
系統時間:2024-05-07 8:26:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!