c 防止重複執行 彈出已執行視窗並傳遞訊息

2022-02-23 02:51:22 字數 3549 閱讀 8134

最近在寫一款軟體

軟體是用來接收其他程式傳遞過來的命令列,並形成列表

大概的最終效果就像下圖一樣

原本為了程式美觀是打算用listbox自繪列表,字和都繪製好了發現自己不會繪製按鈕

所以最終採用了datagridview控制項,這個直接就可以插入按鈕,就省去了那些問題,不過介面美觀就一直是遺憾了(希望有介面方面的大牛可以指導我!)

因為程式啟動的方式是被其他程式啟動並傳送的有命令列

所以,如果有多條訊息預設情況下會被開啟多個程式,因此開始了如下的各種解決方法

1.命令列的讀取

這個相對就比較簡單了,修改program的main方法

[stathread]

static

void main(string

args)

這樣就實現了獲取命令列,命令列中間用空格隔開,最終程式得到args文字陣列

視窗新增獲取陣列的初始化方法

public form1(string

args)

catch

(exception)

}

當然這些都是十分簡單的,網上隨手查閱就能找到

接下來是程式禁止重複執行,因為我們想把列表顯示在乙個視窗中,而不是每個視窗都顯示一條資料

所以程式是不可以被重複執行的.program.cs新增**如下

#region 防止重複執行

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

新增之後再main方法做判斷,並且如果已經存在開啟的視窗的話,就啟用開啟的視窗

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

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

}

接下來重新改動一下main方法

static

void main(string

args)

else

}}

這樣,傳送引數的部分就完成了.還剩下最後一步,form中接收傳遞過來的引數

在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...