日韩性视频-久久久蜜桃-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只允许运行一个窗体实例的全部內容,希望文章能夠幫你解決所遇到的問題。

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