日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# WinForm只允许运行一个窗体实例

發布時間:2025/6/15 C# 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# WinForm只允许运行一个窗体实例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
大概看了看別人的方法,都是從語法的角度巧妙實現的。
我要實現的目的是dialogForm.Show();
點擊按鈕顯示對話框窗體,如果窗體沒有關閉,再次點擊,不重復顯示。
我用了個笨方法,就是用一個靜態類,在內存中保存個數據。記錄窗體是否顯示。
class?CGlobal{static?isShow=false;}在dialogForm.Show();之前判斷一下。
if(CGlobal.isShow==false)
{dialogForm.Show();}
窗體顯示后
Form_Load(){CGlobal.isShow==true;}方法不優雅,但是容易理解,哈哈。

url:http://greatverve.cnblogs.com/archive/2011/06/28/csharp-one-form.html

參考一:C# 只允許運行一個程序實例
using?System;
using?System.Windows.Forms;
using?System.Runtime.InteropServices;//使用DllImport的必須。
using?System.Diagnostics;//引入Process?類

namespace?命名空間
{
????
static?class?Program
????{

????????
private?const?int?WS_SHOWNORMAL?=?1;
????????[DllImport(
"User32.dll")]
????????
private?static?extern?bool?ShowWindowAsync(IntPtr?hWnd,?int?cmdShow);
????????[DllImport(
"User32.dll")]
????????
private?static?extern?bool?SetForegroundWindow(IntPtr?hWnd);

????????
///?<summary>
????????
///?應用程序的主入口點。
????????
///?</summary>
????????[STAThread]
????????
static?void?Main()
????????{
????????????Process?instance?
=?GetRunningInstance();
????????????
if?(instance?==?null)
????????????{
????????????????Application.EnableVisualStyles();
????????????????Application.SetCompatibleTextRenderingDefault(
false);
????????????????Application.Run(
new?frm_Main());//在這啟動主窗體。
????????????}
????????????
else
????????????{
????????????????HandleRunningInstance(instance);
????????????}
????????}
????????
///?<summary>
????????
///?獲取當前是否具有相同進程。
????????
///?</summary>
????????
///?<returns></returns>
????????public?static?Process?GetRunningInstance()
????????{
????????????Process?current?
=?Process.GetCurrentProcess();
????????????Process[]?processes?
=?Process.GetProcessesByName(current.ProcessName);
????????????
//遍歷正在有相同名字運行的例程???
????????????foreach?(Process?process?in?processes)
????????????{
????????????????
//忽略現有的例程???
????????????????if?(process.Id?!=?current.Id)
????????????????????
//確保例程從EXE文件運行?
????????????????????if?(?System.Reflection.Assembly.GetExecutingAssembly().Location.Replace("/"?,?"\\")?==?current.MainModule.FileName?)
????????????????????????
return?process;
????????????}
????????????
return?null;
????????}
????????
///?<summary>
????????
///?激活原有的進程。
????????
///?</summary>
????????
///?<param?name="instance"></param>
????????public?static?void?HandleRunningInstance(Process?instance)
????????{
????????????ShowWindowAsync(instance.MainWindowHandle,?WS_SHOWNORMAL);
????????????SetForegroundWindow(instance.MainWindowHandle);
????????}
????}
}

參考二:C#中只允許產生一個類的實例的方法

有的時候我們會碰到這樣的情況:在一個窗體中,我們點擊一個按鈕產生一個新的窗體,如果我們在代碼中不進行限制的話,再點擊一次按鈕,又會產生一個窗體,對于每個窗體當然是有一個窗體的實例和它對應,如果我想在程序中只允許生成一個類的實例該怎么辦呢?其實實現上面不能再產生一個新的窗體還是比較簡單的實現的,可以在產生了窗體以后我們設置按鈕屬性為不可用:Button1.Enable=false;?
但是,我在這里想實現的是不用讓按鈕不可用,來完成程序只能產生一個類的實例的方法:?

方法一:?
如果一個類你只想一個實例對其進行操作,那么我們可以將類中的域,屬性以及函數都定義為static的,而且我們把構造函數定義成private的,這樣只有類名才能對類里面的域,屬性還有方法進行訪問了,而且該類也不能在類外創建一個實例了。

public?class?Class2??
{?
???????????
private?Class2(){}??
???????????
public?static?Type?VariableName;??
???????????
public?static?Type?FunctionName(){}??
}
?

這中方法不適合于WINFORM程序中的窗體類。?

方法二:??
設置一個bool型的變量來表識是否已經創建了一個實例。?

public?class?Class2?
????
{?
????????
private?Class2()?
????????
{?
????????}
?
????????private?static?
bool?instance_flag=false;?
????????
public?static?Class2?GetInstance()?
????????
{?
????????????
if(!instance_flag)?
????????????
{?
????????????????Class2?c2
=new?Class2();?
????????????????instance_flag
=true;?
????????????????
return?c2;?
????????????}
?
????????????
else?
????????????
{?
????????????????Console.WriteLine(
"you?have?already?create?a?instance");?
????????????????
return?null;?
????????????}
?
?
????????}
?
????}
?

如果已經創建了一個實例,那么instance_flag=true,這樣程序就知道已經有一個實例已經創建,將不會創建新的實例。?

方法三:?
在Class2中創建一個類的實例,該實例是static的,然后在類外面直接用這個實例進行賦值,也可通過函數來返回這個類的實例。但是這樣的話,就會在編譯的時候就會產生這個類的實例,它會浪費資源,效率也不高,可以在需要用到實例的時候才生成,代碼如下:?

????public?class?Class2?
????
{?
????????
private?Class2()?
????????
{?
????????}
?
????????
private?static?Class2?c2=null;?
????????
public?static?Class2?GetInstance()?
????????
{?
????????????
if(c2==null)?
????????????
{?
????????????????c2
=new?Class2();?
????????????}
?
????????????
return?c2;?
????????}
?
????}
?

static方法只能訪問static的域。根據以上代碼,在需要使用實例的時候,可以用類名來調用GetInstance()方法。來返回一個實例。?
以上方法不能使用構造函數,因為都將構造函數設置成了private的,目的也是這樣,禁止多次生成實例。新手感想,有問題請幫忙指出,謝謝!?

轉載于:https://www.cnblogs.com/greatverve/archive/2011/06/28/csharp-one-form.html

總結

以上是生活随笔為你收集整理的C# WinForm只允许运行一个窗体实例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本高清www | 色欲一区二区三区精品a片 在线观看黄网站 | 日韩亚洲一区二区三区 | 国产精品视频一二三区 | 成人亚洲欧美 | 老版水浒传83版免费播放 | 91av俱乐部| 欧美一区二区网站 | 欧美激情在线观看视频 | 粗了大了 整进去好爽视频 日本女优中文字幕 | 国产色啪 | 中文字幕va| 色噜噜狠狠成人中文 | 欧美成人a∨高清免费观看 国产精品999视频 | 亚洲成a人v欧美综合天堂麻豆 | 美丽的姑娘观看在线播放 | 国产成人在线观看网站 | 一区二区三区在线观看免费视频 | 亚洲av无码乱码在线观看富二代 | 久久久性视频 | 国产一区在线视频观看 | 日韩1级片| 鲁大师私人影院在线观看 | 国产精品久久久久久无人区 | 国产精伦| 成人xxxx | 亚洲一区二区三区免费看 | www中文字幕在线观看 | 99自拍 | 国产人妖ts重口系列网站观看 | 一个综合色 | 欧美日韩二区三区 | 男女啪啪网站免费 | 伊人亚洲 | 美女在线国产 | 色哟哟视频在线 | 波多野结衣一区二区三区高清 | 哪里可以看免费毛片 | 小早川怜子一区二区三区 | 69久久久久 | 亚色视频 | 国产精品午夜视频 | 久久看视频 | 操视频网站 | 中文字幕xxx| 在线播放一区二区三区 | 成人免费视频a | 丰满大乳少妇在线观看网站 | 老汉色老汉首页av亚洲 | 日韩精美视频 | 图片区视频区小说区 | 国产jjizz一区二区三区视频 | 日韩一二三区 | 亚洲综合精品在线 | 中文在线免费视频 | 偷拍亚洲色图 | 国产精品久久777777毛茸茸 | 亚洲一区观看 | 影音先锋成人在线 | 精品少妇久久久久久888优播 | 国产精品欧美激情在线 | 91麻豆成人精品国产 | 日韩不卡视频一区二区 | 波多野结衣黄色片 | 午夜免费福利小电影 | 视频一区二区在线播放 | 午夜av成人| 成人免费无遮挡无码黄漫视频 | 小向美奈子在线观看 | 亚洲成人激情在线 | 青娱乐国产精品 | 天天做天天干 | 农民工hdxxxx性中国 | www.jizzjizz| 在线午夜 | 国产三级精品在线观看 | 日韩精品一区二区三区视频 | 国产剧情一区在线 | 一区二区三区国产视频 | 诱夫1v1高h | 精品国产av 无码一区二区三区 | 91 久久 | 亚洲色成人一区二区三区小说 | 欧美视频第一区 | 青青草国产成人99久久 | 久久亚洲私人国产精品va | 天堂中文在线观看视频 | www精品国产| 日韩中文在线观看 | 日韩大片免费观看 | 一级黄色片免费 | 日皮在线观看 | 一个人在线观看www软件 | 国产剧情在线一区 | 日韩国产高清在线 | 国产亚洲精品久久久久久青梅 | 久久中文字幕一区二区 | 黄色一级大片在线免费看国产一 | 中文在线字幕免 |