最近在寫一款軟體
軟體是用來接收其他程式傳遞過來的命令列,並形成列表
大概的最終效果就像下圖一樣
原本為了程式美觀是打算用listbox自繪列表,字和都繪製好了發現自己不會繪製按鈕
所以最終採用了datagridview控制項,這個直接就可以插入按鈕,就省去了那些問題,不過介面美觀就一直是遺憾了(希望有介面方面的大牛可以指導我!)
因為程式啟動的方式是被其他程式啟動並傳送的有命令列
所以,如果有多條訊息預設情況下會被開啟多個程式,因此開始了如下的各種解決方法
1.命令列的讀取
這個相對就比較簡單了,修改program的main方法
[stathread]這樣就實現了獲取命令列,命令列中間用空格隔開,最終程式得到args文字陣列static
void main(string
args)
視窗新增獲取陣列的初始化方法
public form1(string當然這些都是十分簡單的,網上隨手查閱就能找到args)
catch
(exception)
}
接下來是程式禁止重複執行,因為我們想把列表顯示在乙個視窗中,而不是每個視窗都顯示一條資料
所以程式是不可以被重複執行的.program.cs新增**如下
#region 防止重複執行新增之後再main方法做判斷,並且如果已經存在開啟的視窗的話,就啟用開啟的視窗public
static
process runninginstance()}}
return
null
; }
public
static
void
handlerunninginstance(process instance)
[dllimport(
"user32.dll")]
private
static
extern
bool showwindowasync(intptr hwnd, int
cmdshow);
[dllimport(
"user32.dll")]
private
static
extern
bool
setforegroundwindow(intptr hwnd);
private
const
int ws_shownormal = 1
;
#endregion
static做完這些,程式已經不能被重複執行了,再測試,新的問題又來了...程式沒有被多次開啟,但是同樣的,列表永遠只會有一條資料,不會被更新void main(string
args)
else
}
新執行的程式收到的命令列沒能告知到舊的視窗,因此需要傳遞值到舊的視窗,這個方法也有很多,最終我採用的是sendmessage
新增**如下
#region 傳送訊息然後再封裝乙個方法const
int wm_copydata = 0x004a
;
[dllimport(
"user32.dll
", entrypoint = "
sendmessage")]
private
static
extern
int sendmessage(intptr hwnd, int msg, uint wparam, ref
copydatastruct lparam);
[dllimport(
"user32.dll
", entrypoint = "
findwindow")]
private
static
extern
int findwindow(string lpclassname, string
lpwindowname);
public
struct
copydatastruct
#endregion
static接下來重新改動一下main方法void send(string
args)
byte sarr =system.text.encoding.default.getbytes(sb.tostring());
int len =sarr.length;
copydatastruct cds;
cds.dwdata = (intptr)100
; cds.lpdata =sb.tostring();
cds.cbdata = len + 1
;
int sendret = sendmessage((intptr)window_handler, wm_copydata, 0, ref
cds);
if (sendret != 0
)
}else
}
static這樣,傳送引數的部分就完成了.還剩下最後一步,form中接收傳遞過來的引數void main(string
args)
else
}}
在form中新增如下**
#region 接收訊息做完這些我們想要的效果就完全實現了,每次我們的程式被執行都只會有乙個視窗,並且所有的資料會彙總在這裡protected
override
void defwndproc(ref
system.windows.forms.message m)
,stringsplitoptions.removeemptyentries);
if (s.length>0
)
break
;
default
:
base.defwndproc(ref
m);
break
; }
}public
struct
copydatastruct
#endregion
另外,希望有會自繪列表中帶有按鈕的大大們,可以指導一下小生
防止shell指令碼重複執行
利用鎖機制,讓乙個特定的shell指令碼,每次只能執行乙個例項。具體來說,獲得鎖的指令碼例項,能夠繼續往下執行臨界區 沒有獲得鎖的例項,則只能等待。例如,要求指令碼只能順序訪問某個資源,例如磁碟檔案等,就可以參考下面的實現。bin bash file locking using bash.ver 0...
防止程式被重複執行
防止程式被重複執行 第一法 windows95的程式一般都可以重複執行,例如你按下win e組合鍵即啟動資 源管理器,如果再按win e組合鍵又會出現乙個資源管理器,這兩個程式互不幹 擾。有時候你可以需要製作這樣乙個程式 當該程式已經執行時,若使用者企圖 再次執行該程式則只會啟用那個已執行的程式,而...
ABAP 防止程式重複執行
有的程式需要現在同一時間只能執行乙個,這種需求可以用鎖的方式來實現,在start of selection 事件後加鎖,如果是加鎖成功,說明還沒有程式在執行,如果是加鎖失敗,則說明已經有同名程式在執行,報錯即可。注 這個鎖是借用程式修改的鎖,在se38修改程式的時候也會加這個鎖。程式如下 start...