WinForm程式呼叫並Host控制台的方法

2022-03-22 08:07:02 字數 1695 閱讀 7693

做乙個小工具,想把一些輸出資訊使用控制台來顯示。一種方式,採用log4net;第二種方式,自己編碼。

網上查了一些資料,需要用win32api來實現。實現**如下:

1、import api

**[dllimport(

"user32.dll

", entrypoint ="

findwindow")]

extern

static

intptr findwindow(

string

lpclassname, 

string

lpwindowname);   

[dllimport(

"user32.dll

", entrypoint ="

getsystemmenu

")]   

extern

static

intptr getsystemmenu(intptr hwnd, intptr brevert);   

[dllimport(

"user32.dll

", entrypoint ="

removemenu

")]   

extern

static

intptr removemenu(intptr hmenu, 

uint

uposition, 

uint

uflags);   

2、winfom**

**allocconsole();

intptr windowhandle 

=findwindow(

null

, process.getcurrentprocess().mainwindowtitle 

/*process.getcurrentprocess().mainmodule.

*/);

intptr closemenu 

=getsystemmenu(windowhandle, intptr.zero);

showwindow(windowhandle, 1);

//顯示

uint

sc_close 

=0xf060;//

移除關閉按鈕

userapihelper.removemenu(closemenu, sc_close, 

0x0);

consoletitle 

=this

.text +"

-輸出控制台";

console.title 

=consoletitle;

console.foregroundcolor 

=consolecolor.red;

console.writeline(

"歡迎!!!");

注意的一點是使用process.getcurrentprocess().mainwindowtitle 來獲取視窗控制代碼,如果使用filename,當你通過桌面快捷方式啟動程式時,無法獲取到視窗控制代碼,從而無法移除關閉按鈕。

原因:在快捷方式啟動程式時,視窗的filename不包含exe所在路徑,而直接執行exe檔案filename顯示的是exe的全路徑。

效果圖:

Winform程式中呼叫cmd命令

messagebox.show command命令 output catch exception a 上面注釋掉的幾行,網上有說呼叫的時候是需要機器的使用者名稱和密碼的,但是經測試,不用也可以。ps 遇到的乙個問題,若將上面的視窗顯示設為false process.startinfo.createn...

winform呼叫cmd命令

string str console.readline system.diagnostics.process p new system.diagnostics.process p.startinfo.filename cmd.exe p.startinfo.useshellexecute false...

winform呼叫webservice假死怎麼解決

主線程呼叫外部web service,沒有返回時,主線程阻塞了,介面肯定假死 耗時操作都是要在工作執行緒裡面執行的。一般情況下winform呼叫webservice時步驟 1新增服務引用 高階 新增web引用 填寫url 新增web引用即可完成對webservice的引用 讓vs.net環境來為我們...