• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Tạo chương trình chỉ chạy 1 instance 1 lúc

Các bài viết hướng dẫn về Visual Basic .NET và C#

Điều hành viên: tungcan5diop, QUANITGROBEST

Hình đại diện của người dùng
Kỳ Nam
Guru
Guru
Bài viết: 510
Ngày tham gia: CN 12/08/2007 8:47 pm
Đến từ: Qui Nhơn
Been thanked: 1 time
Liên hệ:

Tạo chương trình chỉ chạy 1 instance 1 lúc

Gửi bàigửi bởi Kỳ Nam » T.Tư 18/06/2008 2:13 am

Tên bài viết: Tạo chương trình chỉ chạy 1 instance 1 lúc
Tác giả: kỳ nam
Cấp độ bài viết: 0 dễ hiểu , nhưng rất dễ dùng
Tóm tắt: Tạo chương trình chỉ chạy 1 instance 1 lúc , khi ct được chạy lần 2 thì sẽ kích hoạt instance đầu tiên và đưa tham số cho nó , .NET


Chương trình chỉ chạy 1 instance 1 lúc : người dùng 0 bật được chương trình 1 lúc 2 lần

VD :
test.exe -> chạy test.exe
test.exe /a /b /c -> test.exe đã chạy ở trên sẽ nhận được tham số /a /b /c

Nếu bạn viết VB , chắc đã biết VB hỗ trợ single instance , để dùng nó chỉ cần dô project properties và chọn enable application framework + single instance application

single instance application là 1 phần của VB application model , VB application model là 1 framework viết bởi VB team , mục đích là làm đơn giản bớt việc viết chương trình

bạn cũng có thể dùng VBAM trong C# , nhưng phải tự viết thêm mấy dòng code , còn trong VB thì code đó được tự tạo

dưới đây bày cách tạo single instance application , 0 dùng VBAM

Phần lớn code lấy từ microsoft.visualbasic.dll

cách làm :

1/ dùng Threading.Mutex để tạo single instance application

2/ dùng remoting để truyền tham số ( nói ở VD trên )

2.1/ khi instance 1 chạy , tạo 1 remoting object có chứa pointer đến thủ tục mà mình sẽ chạy khi instance 2 được chạy

2.2/ lưu URL của remoting object vào memory file mapping ( đây là vùng bộ nhớ có thể dùng chung cho các chương trình )

2.3/ khi instance 2 được chạy , lấy URL của remoting object đã được lưu lúc trước bởi instance 1 -> lấy remoting object có URL đó -> chạy thủ tục trên remoting object ( thủ tục này nằm trên instance 1 )

Mã: Chọn hết

  1.        Dim CreatedNew As Boolean
  2.         Dim M As New System.Threading.Mutex(True, ApplicationInstanceID, CreatedNew)
  3.         If CreatedNew Then 'chưa có instance nào đang chạy
  4.                 'tạo remoting object
  5.                 'chạy thủ tục Main() của instance 1
  6.         Else 'instance 1 đã chạy
  7.                 'tìm remoting object của instance 1
  8.                 'dùng remoting object để chạy thủ tục Main() của instance 1
  9.         End If


code của class chính SingleInstanceApplication

referencer : system.runtime.remoting

Mã: Chọn hết

  1. Imports System.Runtime.InteropServices
  2. Imports System.Runtime.Remoting
  3. Imports System.Net
  4. Imports Microsoft.Win32.SafeHandles
  5. Imports System.Security.Principal
  6.  
  7. <StructLayout(LayoutKind.Sequential)> _
  8. Public NotInheritable Class SECURITY_ATTRIBUTES
  9.     Implements IDisposable
  10.  
  11.     Public nLength As Integer = Marshal.SizeOf(GetType(SECURITY_ATTRIBUTES))
  12.     Public lpSecurityDescriptor As IntPtr
  13.     Public bInheritHandle As Boolean
  14.  
  15.     Public Sub Dispose() Implements IDisposable.Dispose
  16.         If (Me.lpSecurityDescriptor <> IntPtr.Zero) Then
  17.             UnsafeNativeMethods.LocalFree(Me.lpSecurityDescriptor)
  18.             Me.lpSecurityDescriptor = IntPtr.Zero
  19.         End If
  20.         GC.SuppressFinalize(Me)
  21.     End Sub
  22.  
  23.     Protected Overrides Sub Finalize()
  24.         Me.Dispose()
  25.         MyBase.Finalize()
  26.     End Sub
  27.  
  28. End Class
  29.  
  30. <System.Security.SuppressUnmanagedCodeSecurity(), ComVisible(False)> _
  31. Friend NotInheritable Class UnsafeNativeMethods
  32.  
  33.     Private Sub New()
  34.     End Sub
  35.  
  36.     <DllImport("Kernel32", CharSet:=CharSet.Auto, SetLastError:=True)> _
  37.     Friend Shared Function CreateFileMapping(ByVal hFile As HandleRef, <MarshalAs(UnmanagedType.LPStruct)> ByVal lpAttributes As SECURITY_ATTRIBUTES, ByVal flProtect As Integer, ByVal dwMaxSizeHi As Integer, ByVal dwMaxSizeLow As Integer, ByVal lpName As String) As IntPtr
  38.     End Function
  39.  
  40.     <DllImport("kernel32", SetLastError:=True, ExactSpelling:=True)> _
  41.     Friend Shared Function LocalFree(ByVal LocalHandle As IntPtr) As IntPtr
  42.     End Function
  43.  
  44.     <DllImport("Kernel32", CharSet:=CharSet.Auto, SetLastError:=True)> _
  45.     Friend Shared Function MapViewOfFile(ByVal hFileMapping As HandleRef, ByVal dwDesiredAccess As Integer, ByVal dwFileOffsetHigh As Integer, ByVal dwFileOffsetLow As Integer, ByVal dwNumberOfBytesToMap As Integer) As IntPtr
  46.     End Function
  47.  
  48.     <DllImport("Kernel32", CharSet:=CharSet.Auto, SetLastError:=True)> _
  49.     Friend Shared Function OpenFileMapping(ByVal dwDesiredAccess As Integer, <MarshalAs(UnmanagedType.Bool)> ByVal bInheritHandle As Boolean, ByVal lpName As String) As IntPtr
  50.     End Function
  51.  
  52.     <DllImport("Kernel32", CharSet:=CharSet.Auto, SetLastError:=True)> _
  53.     Friend Shared Function UnmapViewOfFile(ByVal pvBaseAddress As HandleRef) As <MarshalAs(UnmanagedType.Bool)> Boolean
  54.     End Function
  55.  
  56. End Class
  57.  
  58. Friend NotInheritable Class NativeMethods
  59.  
  60.     <DllImport("Advapi32.dll", CharSet:=CharSet.Unicode, SetLastError:=True)> _
  61.     Friend Shared Function ConvertStringSecurityDescriptorToSecurityDescriptor(ByVal StringSecurityDescriptor As String, ByVal StringSDRevision As UInt32, ByRef SecurityDescriptor As IntPtr, ByVal SecurityDescriptorSize As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
  62.     End Function
  63.  
  64. End Class
  65.  
  66. Public Delegate Sub EntryPoint(ByVal Args() As String)
  67.  
  68. Public Class CantStartSingleInstanceException
  69.     Inherits Exception
  70. End Class
  71.  
  72. Public Class SingleInstanceApplication
  73.  
  74.     Private Class RemoteCommunicator
  75.         Inherits MarshalByRefObject
  76.  
  77.         Private OriginalUser As WindowsIdentity
  78.         Private StartNextInstanceDelegate As EntryPoint
  79.  
  80.         Public Sub New(ByVal StartNextInstanceDelegate As EntryPoint)
  81.             OriginalUser = WindowsIdentity.GetCurrent
  82.             Me.StartNextInstanceDelegate = StartNextInstanceDelegate
  83.         End Sub
  84.  
  85.         Public Overrides Function InitializeLifetimeService() As Object
  86.             Return Nothing
  87.         End Function
  88.  
  89.         <Messaging.OneWay()> _
  90.         Public Sub RunNextInstance(ByVal Args As String())
  91.             If OriginalUser.User.Equals(WindowsIdentity.GetCurrent.User) Then
  92.                 StartNextInstanceDelegate(Args)
  93.             End If
  94.         End Sub
  95.  
  96.     End Class
  97.  
  98.     Private Shared MemoryMappedID As String
  99.     Private Shared FirstInstanceMemoryMappedFileHandle As SafeFileHandle
  100.  
  101.     Public Shared Sub Run(ByVal Args() As String, ByVal Start As EntryPoint, ByVal StartNextInstance As EntryPoint)
  102.         Dim ApplicationInstanceID As String = Marshal.GetTypeLibGuidForAssembly(Reflection.Assembly.GetCallingAssembly).ToString
  103.         MemoryMappedID = ApplicationInstanceID & "Map"
  104.  
  105.         Dim CreatedNew As Boolean
  106.         Dim M As New System.Threading.Mutex(True, ApplicationInstanceID, CreatedNew)
  107.  
  108.         Dim identity As String = WindowsIdentity.GetCurrent.Name
  109.         Dim secureChannel As Boolean = (identity <> "")
  110.  
  111.         If CreatedNew Then
  112.             Try
  113.                 Dim Communicator As New RemoteCommunicator(StartNextInstance)
  114.                 Dim URI As String = ApplicationInstanceID & ".rem"
  115.                 RemotingServices.Marshal(Communicator, URI)
  116.                 Dim Channel As Channels.Tcp.TcpChannel = RegisterChannel(secureChannel)
  117.                 Dim URL As String = Channel.GetUrlsForUri(URI)(0)
  118.                 WriteUrlToMemoryMappedFile(URL)
  119.             Catch
  120.             End Try
  121.             Start(Args)
  122.         Else
  123.             Dim URL As String = ReadUrlFromMemoryMappedFile()
  124.             If URL Is Nothing Then Throw New CantStartSingleInstanceException
  125.             RegisterChannel(secureChannel)
  126.             Dim Communicator As RemoteCommunicator = DirectCast(RemotingServices.Connect(GetType(RemoteCommunicator), URL), RemoteCommunicator)
  127.             Communicator.RunNextInstance(Args)
  128.         End If
  129.  
  130.         GC.KeepAlive(M)
  131.     End Sub
  132.  
  133.     Private Shared Function RegisterChannel(ByVal SecureChannel As Boolean) As Channels.Tcp.TcpChannel
  134.         Dim properties As New Hashtable(3)
  135.         properties.Add("bindTo", HostName)
  136.         properties.Add("port", 0)
  137.         If SecureChannel Then
  138.             properties.Add("secure", True)
  139.             properties.Add("tokenimpersonationlevel", TokenImpersonationLevel.Impersonation)
  140.             properties.Add("impersonate", True)
  141.         End If
  142.         Dim Channel As New Channels.Tcp.TcpChannel(properties, Nothing, Nothing)
  143.         Channels.ChannelServices.RegisterChannel(Channel, SecureChannel)
  144.         Return Channel
  145.     End Function
  146.  
  147.     Private Shared ReadOnly Property HostName() As String
  148.         Get
  149.             If Sockets.Socket.SupportsIPv4 Then
  150.                 Return IPAddress.Loopback.ToString
  151.             ElseIf Sockets.Socket.OSSupportsIPv6 Then
  152.                 Return IPAddress.IPv6Loopback.ToString
  153.             Else
  154.                 Throw New RemotingException
  155.             End If
  156.         End Get
  157.     End Property
  158.  
  159.     Private Shared Sub WriteUrlToMemoryMappedFile(ByVal URL As String)
  160.         Using SA As SECURITY_ATTRIBUTES = New SECURITY_ATTRIBUTES
  161.             Dim OK As Boolean
  162.             SA.bInheritHandle = False
  163.             Try
  164.                 OK = NativeMethods.ConvertStringSecurityDescriptorToSecurityDescriptor("D:(A;;GA;;;CO)(A;;GR;;;AU)", 1, SA.lpSecurityDescriptor, IntPtr.Zero)
  165.             Catch exception As EntryPointNotFoundException
  166.                 SA.lpSecurityDescriptor = IntPtr.Zero
  167.             Catch exception2 As DllNotFoundException
  168.                 SA.lpSecurityDescriptor = IntPtr.Zero
  169.             End Try
  170.             If Not OK Then
  171.                 SA.lpSecurityDescriptor = IntPtr.Zero
  172.             End If
  173.             Dim hFile As New HandleRef(Nothing, -1)
  174.             FirstInstanceMemoryMappedFileHandle = New SafeFileHandle(UnsafeNativeMethods.CreateFileMapping(hFile, SA, 4, 0, (URL.Length + 1) * 2, MemoryMappedID), True)
  175.             If FirstInstanceMemoryMappedFileHandle.IsInvalid Then
  176.                 Throw New Exception("Can't get memory mapped file")
  177.             End If
  178.         End Using
  179.  
  180.         Dim P As IntPtr
  181.         Dim HR As HandleRef
  182.         Try
  183.             HR = New HandleRef(Nothing, FirstInstanceMemoryMappedFileHandle.DangerousGetHandle)
  184.             P = UnsafeNativeMethods.MapViewOfFile(HR, 2, 0, 0, 0)
  185.             If P = IntPtr.Zero Then
  186.                 Throw New Exception("Can't get memory mapped file")
  187.             End If
  188.             Dim Chars As Char() = URL.ToCharArray
  189.             Marshal.Copy(Chars, 0, P, Chars.Length)
  190.         Finally
  191.             If P <> IntPtr.Zero Then
  192.                 HR = New HandleRef(Nothing, P)
  193.                 UnsafeNativeMethods.UnmapViewOfFile(HR)
  194.             End If
  195.         End Try
  196.     End Sub
  197.  
  198.     Private Shared Function ReadUrlFromMemoryMappedFile() As String
  199.         Using SFH As New SafeFileHandle(UnsafeNativeMethods.OpenFileMapping(4, False, MemoryMappedID), True)
  200.             If SFH.IsInvalid Then Return Nothing
  201.             Dim P As IntPtr
  202.             Dim HR As HandleRef
  203.             Try
  204.                 HR = New HandleRef(Nothing, SFH.DangerousGetHandle)
  205.                 P = UnsafeNativeMethods.MapViewOfFile(HR, 4, 0, 0, 0)
  206.                 If P = IntPtr.Zero Then
  207.                     Throw New Exception("Can't get memory mapped file")
  208.                 End If
  209.                 Return Marshal.PtrToStringUni(P)
  210.             Finally
  211.                 If P <> IntPtr.Zero Then
  212.                     HR = New HandleRef(Nothing, P)
  213.                     UnsafeNativeMethods.UnmapViewOfFile(HR)
  214.                 End If
  215.             End Try
  216.         End Using
  217.     End Function
  218.  
  219. End Class

dùng nó

Mã: Chọn hết

  1. Public Class Form1
  2.  
  3.     Shared Sub Main(ByVal Args() As String)
  4.         SingleInstanceApplication.Run(Args, AddressOf Start, AddressOf StartNextInstance)
  5.     End Sub
  6.  
  7.     Private Shared Sub Start(ByVal Args() As String)
  8.         Application.EnableVisualStyles()
  9.         Application.SetCompatibleTextRenderingDefault(False)
  10.         Application.Run(New Form1)
  11.     End Sub
  12.  
  13.     Private Shared Sub StartNextInstance(ByVal Args() As String)
  14.         MessageBox.Show("StartNextInstance")
  15.         MessageBox.Show(Args.Length)
  16.     End Sub
  17.  
  18. End Class

khi instance 2 chạy , nó sẽ được tắt và instance 1 chạy thủ tục StartNextInstance(ByVal Args() As String)



Hình đại diện của người dùng
1045007
Thành viên danh dự
Thành viên danh dự
Bài viết: 551
Ngày tham gia: T.Hai 09/06/2008 3:35 pm
Đến từ: TP Cần Thơ
Has thanked: 2 time
Been thanked: 64 time
Liên hệ:

Re: Tạo chương trình chỉ chạy 1 instance 1 lúc

Gửi bàigửi bởi 1045007 » T.Tư 25/06/2008 5:35 pm

Cám ơn Kỳ Nam nhé, tôi đang làm cái này nhưng trước đó không biết làm sao :D
Xếp hình cổ điển for Android-https://play.google.com
♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀

Hình đại diện của người dùng
clarkkent
Mạnh Thường Quân
Mạnh Thường Quân
Bài viết: 1641
Ngày tham gia: T.Tư 16/04/2008 11:25 am
Đến từ: Chợ Lách - Bến Tre
Been thanked: 31 time
Liên hệ:

Re: Tạo chương trình chỉ chạy 1 instance 1 lúc

Gửi bàigửi bởi clarkkent » T.Sáu 27/06/2008 2:43 pm

Đọc không hiểu cho lắm, nhưng muốn chuơng trình chỉ chạy 1 instance thì có 1 cách rất đơn giản là trong Properties của Project ta check vào Make single instance application
• Hôm bây: www.tinsoftware.com ^ ^
Cố gắng lên...

Hình đại diện của người dùng
Kỳ Nam
Guru
Guru
Bài viết: 510
Ngày tham gia: CN 12/08/2007 8:47 pm
Đến từ: Qui Nhơn
Been thanked: 1 time
Liên hệ:

Re: Tạo chương trình chỉ chạy 1 instance 1 lúc

Gửi bàigửi bởi Kỳ Nam » CN 29/06/2008 2:47 pm

Mới phát hiện ra 1 cái

Mã: Chọn hết

  1.    Shared Sub Main(ByVal Args() As String)
  2.         SingleInstanceApplication.Run(Args, AddressOf Start, AddressOf StartNextInstance)
  3.     End Sub
  4.  
  5.     Private Shared Sub Start(ByVal Args() As String)
  6.     End Sub
  7.  
  8.     Private Shared Sub StartNextInstance(ByVal Args() As String)
  9.     End Sub

-> thủ tục Start() và StartNextInstance() không nằm chung 1 thread

-> đây sẽ là vấn đề nếu bạn viết ct dùng chủ yếu WindowsForm

Dùng class đây để gọi method trong 1 thread

Mã: Chọn hết

  1. Imports System.Windows.Forms
  2. <System.ComponentModel.ToolboxItem(False)> Public NotInheritable Class ThreadManagerControl
  3.     Inherits Control
  4.     Public Sub New()
  5.         CreateHandle()
  6.     End Sub
  7. End Class

Dùng nó

Mã: Chọn hết

  1. Public Delegate Sub EntryPoint(ByVal Args() As String)
  2.     Private Shared TMC As ThreadManagerControl
  3.  
  4.     Shared Sub Main(ByVal Args() As String)
  5.         SingleInstanceApplication.Run(Args, AddressOf Start, AddressOf StartNextInstance)
  6.     End Sub
  7.  
  8.     Private Shared Sub Start(ByVal Args() As String)
  9.         TMC = New ThreadManagerControl
  10.     End Sub
  11.  
  12.     Private Shared Sub StartNextInstanceAdapter(ByVal Args() As String)
  13.         TMC.Invoke(New EntryPoint(AddressOf StartNextInstance), Args)
  14.     End Sub
  15.  
  16.     Private Shared Sub StartNextInstance(ByVal Args() As String)
  17.         'code ở đây
  18.     End Sub

-> Start() và StartNextInstance() sẽ chạy trên cùng thread

Yêu cầu là trên thread của Start() đã có 1 Standard Message Loop , tức là bạn có gọi Application.Run() trong method Start()

anh17d4
Bài viết: 5
Ngày tham gia: CN 27/07/2008 2:32 pm

Re: Tạo chương trình chỉ chạy 1 instance 1 lúc

Gửi bàigửi bởi anh17d4 » CN 27/07/2008 10:46 pm

Em muốn làm một ứng dụng như Kỳ Nam hướng dẫn trên VB 6.0 không biết có thể xem ví dụ cụ thể hơn không? [-O<

tienlbhoc
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 415
Ngày tham gia: T.Bảy 14/07/2007 10:06 pm
Đến từ: Hà Nội
Been thanked: 1 time

Re: Tạo chương trình chỉ chạy 1 instance 1 lúc

Gửi bàigửi bởi tienlbhoc » CN 26/10/2008 7:16 am

hix , bác kỳ nam hướng dẫn cho c# mà code toàn vb.net thế này :( , bác có thể đóng gói thành file exe ví dụ trên được không , mấy cái dịch code vb.net sang c# không tốt bằng dịch ngược file exe sang mã c# đâu :)
Diễn đàn và blog phần mềm tự làm :
http://my.opera.com/DienDanTienlbhoc/forums/
http://my.opera.com/tienlbhoc/blog/

tienlbhoc
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 415
Ngày tham gia: T.Bảy 14/07/2007 10:06 pm
Đến từ: Hà Nội
Been thanked: 1 time

Re: Tạo chương trình chỉ chạy 1 instance 1 lúc

Gửi bàigửi bởi tienlbhoc » CN 26/10/2008 8:34 am

He he , tìm trên code project được rồi nè , code ngắn hơn bác kỳ nam mà c# chính cống , không biết gì thì cứ bê vào mà dùng :D
http://www.codeproject.com/KB/cs/singleinstance.aspx

Mã: Chọn hết

  1. using System;
  2. using System.Windows.Forms;
  3. using System.Runtime.InteropServices;
  4. using System.Text;
  5. using System.Diagnostics;
  6. using System.Threading;
  7. using System.Reflection;
  8. using System.IO;
  9.  
  10. namespace SingleInstance
  11. {
  12.     /// <summary>
  13.     /// Summary description for SingleApp.
  14.     /// </summary>
  15.     public class SingleApplication
  16.     {
  17.         /// <summary>
  18.         /// Imports
  19.         /// </summary>
  20.    
  21.         [DllImport("user32.dll")]
  22.         private static extern int ShowWindow(IntPtr hWnd, int nCmdShow);
  23.  
  24.         [DllImport("user32.dll")]
  25.         private static extern int SetForegroundWindow(IntPtr hWnd);
  26.  
  27.         [DllImport("user32.dll")]
  28.         private static extern int IsIconic(IntPtr hWnd);
  29.  
  30.         /// <summary>
  31.         /// GetCurrentInstanceWindowHandle
  32.         /// </summary>
  33.         /// <returns></returns>
  34.         private static IntPtr GetCurrentInstanceWindowHandle()
  35.         {    
  36.             IntPtr hWnd = IntPtr.Zero;
  37.             Process process = Process.GetCurrentProcess();
  38.             Process[] processes = Process.GetProcessesByName(process.ProcessName);
  39.             foreach(Process _process in processes)
  40.             {
  41.                 // Get the first instance that is not this instance, has the
  42.                 // same process name and was started from the same file name
  43.                 // and location. Also check that the process has a valid
  44.                 // window handle in this session to filter out other user's
  45.                 // processes.
  46.                 if (_process.Id != process.Id &&
  47.                     _process.MainModule.FileName == process.MainModule.FileName &&
  48.                     _process.MainWindowHandle != IntPtr.Zero)    
  49.                 {
  50.                     hWnd = _process.MainWindowHandle;
  51.                     break;
  52.                 }
  53.             }
  54.             return hWnd;
  55.         }
  56.         /// <summary>
  57.         /// SwitchToCurrentInstance
  58.         /// </summary>
  59.         private static void SwitchToCurrentInstance()
  60.         {    
  61.             IntPtr hWnd = GetCurrentInstanceWindowHandle();
  62.             if (hWnd != IntPtr.Zero)    
  63.             {    
  64.                 // Restore window if minimised. Do not restore if already in
  65.                 // normal or maximised window state, since we don't want to
  66.                 // change the current state of the window.
  67.                 if (IsIconic(hWnd) != 0)
  68.                 {
  69.                     ShowWindow(hWnd, SW_RESTORE);
  70.                 }
  71.  
  72.                 // Set foreground window.
  73.                 SetForegroundWindow(hWnd);
  74.             }
  75.         }
  76.  
  77.         /// <summary>
  78.         /// Execute a form base application if another instance already running on
  79.         /// the system activate previous one
  80.         /// </summary>
  81.         /// <param name="frmMain">main form</param>
  82.         /// <returns>true if no previous instance is running</returns>
  83.         public static bool Run(System.Windows.Forms.Form frmMain)
  84.         {
  85.             if(IsAlreadyRunning())
  86.             {
  87.                 //set focus on previously running app
  88.                 SwitchToCurrentInstance();
  89.                 return false;
  90.             }
  91.             Application.Run(frmMain);
  92.             return true;
  93.         }
  94.  
  95.         /// <summary>
  96.         /// for console base application
  97.         /// </summary>
  98.         /// <returns></returns>
  99.         public static bool Run()
  100.         {
  101.             if(IsAlreadyRunning())
  102.             {
  103.                 return false;
  104.             }
  105.             return true;
  106.         }
  107.  
  108.         /// <summary>
  109.         /// check if given exe alread running or not
  110.         /// </summary>
  111.         /// <returns>returns true if already running</returns>
  112.         private static bool IsAlreadyRunning()
  113.         {
  114.             string strLoc = Assembly.GetExecutingAssembly().Location;
  115.             FileSystemInfo fileInfo = new FileInfo(strLoc);
  116.             string sExeName = fileInfo.Name;
  117.             bool bCreatedNew;
  118.  
  119.             mutex = new Mutex(true, "Global\\"+sExeName, out bCreatedNew);
  120.             if (bCreatedNew)
  121.                 mutex.ReleaseMutex();
  122.  
  123.             return !bCreatedNew;
  124.         }
  125.        
  126.         static Mutex mutex;
  127.         const int SW_RESTORE = 9;
  128.     }
  129. }


Sử dụng code rất dễ chỉ cần thế này nếu là ứng dụng winapp

Mã: Chọn hết

  1. static void Main()
  2. {
  3.    SingleInstance.SingleApplication.Run(new FrmMain());
  4. }


Nếu là ứng dụng console thì:

Mã: Chọn hết

  1. static void Main()
  2. {
  3.    if(SingleInstance.SingleApplication.Run() == false)
  4.    {
  5.       return;
  6.    }
  7.    //Write your program logic here
  8. }
Diễn đàn và blog phần mềm tự làm :
http://my.opera.com/DienDanTienlbhoc/forums/
http://my.opera.com/tienlbhoc/blog/

Hình đại diện của người dùng
Kỳ Nam
Guru
Guru
Bài viết: 510
Ngày tham gia: CN 12/08/2007 8:47 pm
Đến từ: Qui Nhơn
Been thanked: 1 time
Liên hệ:

Re: Tạo chương trình chỉ chạy 1 instance 1 lúc

Gửi bàigửi bởi Kỳ Nam » CN 26/10/2008 8:44 am

cái đó chỉ hiện được window lên thôi , còn instance 1 đâu có biết được là instance 2 đã được chạy , và instance 1 cũng 0 nhận được tham số mới

tienlbhoc
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 415
Ngày tham gia: T.Bảy 14/07/2007 10:06 pm
Đến từ: Hà Nội
Been thanked: 1 time

Re: Tạo chương trình chỉ chạy 1 instance 1 lúc

Gửi bàigửi bởi tienlbhoc » CN 26/10/2008 8:46 am

Ừm , cái này nếu dùng notify icon thì cũng không hiện lên được , bác kỳ nam đóng gói chỗ kia vào thành 1 file exe đi :D
Diễn đàn và blog phần mềm tự làm :
http://my.opera.com/DienDanTienlbhoc/forums/
http://my.opera.com/tienlbhoc/blog/

Hình đại diện của người dùng
Kỳ Nam
Guru
Guru
Bài viết: 510
Ngày tham gia: CN 12/08/2007 8:47 pm
Đến từ: Qui Nhơn
Been thanked: 1 time
Liên hệ:

Re: Tạo chương trình chỉ chạy 1 instance 1 lúc

Gửi bàigửi bởi Kỳ Nam » CN 26/10/2008 8:59 am

bận rồi , đang sửa soft , chắc tuần nữa mới xong , hậu quả của ngày xưa kém cỏi viết code dính liền UI với các thuật toán

tui còn 1 class nhiều chức năng hơn code ở trên ( gồm app 1 instance , splash screen , tắt chương trình khi tất cả form đã đóng ) , xịn hơn vb app model , rất dễ dùng , sẽ pót lúc rảnh , hê chờ nhe

tienlbhoc
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 415
Ngày tham gia: T.Bảy 14/07/2007 10:06 pm
Đến từ: Hà Nội
Been thanked: 1 time

Re: Tạo chương trình chỉ chạy 1 instance 1 lúc

Gửi bàigửi bởi tienlbhoc » T.Hai 27/10/2008 1:09 pm

Chờ bác thì biết bao giờ mới xong :D , hôm trước bảo bao giờ có bộ gõ thì sẽ cho em xem cái khai báo sendInput cho unicode mà giờ vẫn chưa có (chưa có bộ gõ) , với cả code bác em dùng phần mềm dịch chạy lỗi chả hiểu lắm :D ,đành phải tự thân vận động , em đã tìm được :
http://www.hvaonline.net/hvaonline/posts/list/24286.hva
Nhưng code trên nó lại hiện thông báo , mà em cần là active cơ nên sửa lại tí :

Mã: Chọn hết

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Windows.Forms;
  4. using System.Threading;
  5. using Microsoft.Win32;
  6. using System.Runtime.InteropServices;
  7. using System.Diagnostics;
  8. using Microsoft.VisualBasic.ApplicationServices;
  9.  
  10.  
  11. namespace Lab
  12. {
  13.     static class Program
  14.     {
  15.         /// <summary>
  16.         /// The main entry point for the application.
  17.         /// </summary>
  18.         static Form1 form1;
  19.         [STAThread]
  20.         static void Main()
  21.         {
  22.             Application.EnableVisualStyles();
  23.             Application.SetCompatibleTextRenderingDefault(false);
  24.             SingleInstance.Run(form1=new Form1(),new StartupNextInstanceEventHandler(StartupNextInstanceHandler));
  25.         }
  26.         public static void StartupNextInstanceHandler(object sender, StartupNextInstanceEventArgs e)
  27.         {
  28.             form1.Show(); [b]// chính là cái này [/b]
  29.         }
  30.     }
  31. }

Nhưng lại có 1 vấn đề là khi chạy instance mới nó new Form1() , chưa chạy nó đã tắt luôn nên thành ra 2 cái icon ở khay hệ thống ( dùng chuột chỉ vào cái mới tạo đã tắt ngay thì mới mất ). Nên phải khắc phục bằng hide cái icon notify khi khởi động , đến lúc sự kiện shown (form không bị cản trở khi khởi động và đã load đầy đủ) , thì mới show nó

Mã: Chọn hết

  1.        private void Form1_Shown(object sender, EventArgs e)
  2.         {
  3.             this.notifyIcon1.Visible = true;
  4.         }

Vậy là giải quyết được trọn vẹn vấn đề ;)
Đây là ứng dụng mẫu (dùng reflector mà dịch ra mã nguồn) , khi bật nó lên sẽ có 1 text , bạn gõ lộn tùng bậy vào đó :D , rồi bấm nút ẩn để ẩn nó đi .
Rồi giờ kích vào file đó 1 phát nữa (chạy instance thứ 2) , nó sẽ hiện lại cửa sổ cũ (giống hệt vb.net cái single instance) , bằng chứng đó là cửa sổ cũ là ở chỗ , bạn vừa nãy gõ text gì thì cửa sổ đó cũng có text đó
http://www.mediafire.com/?zjw5la20i0j

Bác Kỳ Nam cho em cái khai báo sendInput Unicode đi , cái có IntPtr ấy , em hiện giờ khai báo kiểu 2 hàm trùng tên có tham số riêng cho 32 và 64 bit , cứ phải kiểm tra môi trường 32 bit hay 64 bit để gọi phương thức send . Lên môi trường 128 bit chẳng hạn lại phải thêm mấy dòng ;;)
Diễn đàn và blog phần mềm tự làm :
http://my.opera.com/DienDanTienlbhoc/forums/
http://my.opera.com/tienlbhoc/blog/

dllcoder
Bài viết: 9
Ngày tham gia: T.Hai 20/10/2008 10:39 pm

Re: Tạo chương trình chỉ chạy 1 instance 1 lúc

Gửi bàigửi bởi dllcoder » T.Hai 27/10/2008 2:34 pm

Bài viết hay quá, mình cũng đang không biết làm cái này thế nào :)
------------
Thanks all!

Hình đại diện của người dùng
Kỳ Nam
Guru
Guru
Bài viết: 510
Ngày tham gia: CN 12/08/2007 8:47 pm
Đến từ: Qui Nhơn
Been thanked: 1 time
Liên hệ:

Re: Tạo chương trình chỉ chạy 1 instance 1 lúc

Gửi bàigửi bởi Kỳ Nam » T.Tư 29/10/2008 3:40 pm

sendinput nè , giờ mà chưa xong hẻ

cái gì 0 cần thì bỏ đi

Mã: Chọn hết

  1.  
  2.         Public Declare Sub keybd_event Lib "User32.dll" (ByVal VirtualKey As VK, ByVal Scan As Byte, ByVal Flags As KeyEventFlag, ByVal dwExtraInfo As IntPtr)
  3.  
  4.     Public Enum VK As Byte
  5.         Lbutton = 1
  6.         Rbutton = 2
  7.         Cancel0 = 3
  8.         Mbutton = 4
  9.         Xbutton1 = 5
  10.         Xbutton2 = 6
  11.         Back = 8
  12.         Tab = 9
  13.         Clear = 12
  14.         Enter = 13
  15.         [Return] = 13
  16.         Shift = 16
  17.         Control = 17
  18.         Menu = 18
  19.         Pause = 19
  20.         Capital = 20
  21.         Hangeul = 21
  22.         Hangul = 21
  23.         Kana = 21
  24.         Junja = 23
  25.         Final = 24
  26.         Hanja = 25
  27.         Kanji = 25
  28.         Escape = 27
  29.         Convert = 28
  30.         Nonconvert = 29
  31.         Accept = 30
  32.         Modechange = 31
  33.         Space = 32
  34.         Prior = 33
  35.         [Next] = 34
  36.         [End] = 35
  37.         Home = 36
  38.         Left = 37
  39.         Up = 38
  40.         Right = 39
  41.         Down = 40
  42.         [Select] = 41
  43.         Print = 42
  44.         Execute = 43
  45.         Snapshot = 44
  46.         Insert = 45
  47.         Delete = 46
  48.         Help = 47
  49.         D0 = 48
  50.         D1 = 49
  51.         D2 = 50
  52.         D3 = 51
  53.         D4 = 52
  54.         D5 = 53
  55.         D6 = 54
  56.         D7 = 55
  57.         D8 = 56
  58.         D9 = 57
  59.         A = 65
  60.         B = 66
  61.         C = 67
  62.         D = 68
  63.         E = 69
  64.         F = 70
  65.         G = 71
  66.         H = 72
  67.         I = 73
  68.         J = 74
  69.         K = 75
  70.         L = 76
  71.         M = 77
  72.         N = 78
  73.         O = 79
  74.         P = 80
  75.         Q = 81
  76.         R = 82
  77.         S = 83
  78.         T = 84
  79.         U = 85
  80.         V = 86
  81.         W = 87
  82.         X = 88
  83.         Y = 89
  84.         Z = 90
  85.         LWin = 91
  86.         RWin = 92
  87.         Apps = 93
  88.         Sleep = 95
  89.         Numpad0 = 96
  90.         Numpad1 = 97
  91.         Numpad2 = 98
  92.         Numpad3 = 99
  93.         Numpad4 = 100
  94.         Numpad5 = 101
  95.         Numpad6 = 102
  96.         Numpad7 = 103
  97.         Numpad8 = 104
  98.         Numpad9 = 105
  99.         Multiply = 106
  100.         Add = 107
  101.         Separator = 108
  102.         Subtract = 109
  103.         [Decimal] = 110
  104.         Divide = 111
  105.         F1 = 112
  106.         F2 = 113
  107.         F3 = 114
  108.         F4 = 115
  109.         F5 = 116
  110.         F6 = 117
  111.         F7 = 118
  112.         F8 = 119
  113.         F9 = 120
  114.         F10 = 121
  115.         F11 = 122
  116.         F12 = 123
  117.         F13 = 124
  118.         F14 = 125
  119.         F15 = 126
  120.         F16 = 127
  121.         F17 = 128
  122.         F18 = 129
  123.         F19 = 130
  124.         F20 = 131
  125.         F21 = 132
  126.         F22 = 133
  127.         F23 = 134
  128.         F24 = 135
  129.         Numlock = 144
  130.         Scroll = 145
  131.         OemFjJisho = 146
  132.         OemNecEqual = 146
  133.         OemFjMasshou = 147
  134.         OemFjTouroku = 148
  135.         OemFjLoya = 149
  136.         OemFjRoya = 150
  137.         LShift = 160
  138.         RShift = 161
  139.         LControl = 162
  140.         RControl = 163
  141.         LMenu = 164
  142.         RMenu = 165
  143.         BrowserBack = 166
  144.         BrowserForward = 167
  145.         BrowserRefresh = 168
  146.         BrowserStop = 169
  147.         BrowserSearch = 170
  148.         BrowserFavorites = 171
  149.         BrowserHome = 172
  150.         VolumeMute = 173
  151.         VolumeDown = 174
  152.         VolumeUp = 175
  153.         MediaNextTrack = 176
  154.         MediaPrevTrack = 177
  155.         MediaStop = 178
  156.         MediaPlayPause = 179
  157.         LaunchMail = 180
  158.         LaunchMediaSelect = 181
  159.         LaunchApp1 = 182
  160.         LaunchApp2 = 183
  161.         Oem1 = 186
  162.         OemPlus = 187
  163.         OemComma = 188
  164.         OemMinus = 189
  165.         OemPeriod = 190
  166.         Oem2 = 191
  167.         Oem3 = 192
  168.         Oem4 = 219
  169.         Oem5 = 220
  170.         Oem6 = 221
  171.         Oem7 = 222
  172.         Oem8 = 223
  173.         OemAx = 225
  174.         Oem102 = 226
  175.         IcoHelp = 227
  176.         Ico00 = 228
  177.         Processkey = 229
  178.         IcoClear = 230
  179.         Packet = 231
  180.         OemReset = 233
  181.         OemJump = 234
  182.         OemPa1 = 235
  183.         OemPa2 = 236
  184.         OemPa3 = 237
  185.         OemWsctrl = 238
  186.         OemCusel = 239
  187.         OemAttn = 240
  188.         OemFinish = 241
  189.         OemCopy = 242
  190.         OemAuto = 243
  191.         OemEnlw = 244
  192.         OemBacktab = 245
  193.         Attn = 246
  194.         Crsel = 247
  195.         Exsel = 248
  196.         Ereof = 249
  197.         Play = 250
  198.         Zoom = 251
  199.         Noname = 252
  200.         Pa1 = 253
  201.         OemClear = 254
  202.    End Enum
  203.  
  204.         Public Declare Function SendInput Lib "User32.dll" (ByVal nInputs As Integer, <MarshalAs(UnmanagedType.LPArray, ArraySubType:=UnmanagedType.Struct, SizeParamIndex:=0)> ByVal pInputs() As Structures.Input, ByVal cbSize As Integer) As UInteger
  205.  
  206.     <StructLayout(LayoutKind.Explicit)> Public Structure Input
  207.  
  208.         <FieldOffset(0)> Public Type As Enums.InputType
  209.         <FieldOffset(4)> Public KeyboardInput As KeyboardInput
  210.         <FieldOffset(4)> Public MouseInput As MouseInput
  211.         <FieldOffset(4)> Public HardwareInput As HardwareInput
  212.  
  213.         Public Function GetStructureSize() As Integer
  214.             Return Marshal.SizeOf(Me)
  215.         End Function
  216.  
  217.     End Structure
  218.  
  219.     <StructLayout(LayoutKind.Sequential)> Public Structure MouseInput
  220.         Public X As Integer
  221.         Public Y As Integer
  222.         Public MouseData As Integer
  223.         Public Flags As MouseEventFlag
  224.         Public Time As Integer
  225.         Public ExtraInfo As IntPtr
  226.     End Structure
  227.  
  228.     <StructLayout(LayoutKind.Sequential)> Public Structure KeyboardInput
  229.         Public VirtualKey As UShort
  230.         Public Scan As UShort
  231.         Public Flags As KeyEventFlag
  232.         Public Time As Integer
  233.         Public ExtraInfo As IntPtr
  234.     End Structure
  235.  
  236.     <StructLayout(LayoutKind.Sequential)> Public Structure HardwareInput
  237.         Public Msg As Integer
  238.         Public ParamL As Short
  239.         Public ParamH As Short
  240.     End Structure
  241.  
  242.     <Flags()> Public Enum KeyEventFlag
  243.         ExtendedKey = &H1
  244.         KeyUp = &H2
  245.         Unicode = &H4
  246.         ScanCode = &H8
  247.     End Enum


Mã: Chọn hết

  1.    Public Shared Sub SendKeysW(ByVal s As String)
  2.         Dim Inputs(s.Length * 2 - 1) As Input
  3.         Dim Input As Input
  4.         Input.Type = InputType.Keyboard
  5.  
  6.         Dim LastIndex As Integer = s.Length - 1
  7.         For i As Integer = 0 To LastIndex
  8.             Input.KeyboardInput.Scan = Convert.ToUInt16(s(i))
  9.             Input.KeyboardInput.Flags = KeyEventFlag.Unicode
  10.             Inputs(i * 2) = Input
  11.             Input.KeyboardInput.Flags = KeyEventFlag.Unicode Or KeyEventFlag.KeyUp
  12.             Inputs(i * 2 + 1) = Input
  13.         Next
  14.  
  15.         User32.SendInput(Inputs.Length, Inputs, Input.GetStructureSize)
  16.     End Sub


còn bộ gõ tui để dành rồi , mức ưu tiên bét , 0 có gì làm thì mới viết tiếp

tienlbhoc
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 415
Ngày tham gia: T.Bảy 14/07/2007 10:06 pm
Đến từ: Hà Nội
Been thanked: 1 time

Re: Tạo chương trình chỉ chạy 1 instance 1 lúc

Gửi bàigửi bởi tienlbhoc » T.Tư 29/10/2008 5:32 pm

sendinput làm rồi , nhưng không biết khai báo IntPtr , nên phải khai báo 2 hàm send cho 32 và 64 bit :(
Nhưng cái này

Mã: Chọn hết

  1.        <FieldOffset(0)> Public Type As Enums.InputType
  2.         <FieldOffset(4)> Public KeyboardInput As KeyboardInput
  3.         <FieldOffset(4)> Public MouseInput As MouseInput
  4.         <FieldOffset(4)> Public HardwareInput As HardwareInput

Không biết có thiếu không ? Vì trong 64 bit em phải khai báo là 8 cho cái FieldOffset này đó , hàm sendkey của dotnet bị liệt trong 64 bit , nếu đây là source lấy từ framework thì chắc chắn die :)

Mã: Chọn hết

  1. // hàm cho win 32
  2. [DllImport("user32.dll", EntryPoint = "SendInput", SetLastError = true)]
  3. static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);
  4.  
  5. // hàm cho win 64
  6. [DllImport("user32.dll", EntryPoint = "SendInput", SetLastError = true)]
  7. static extern uint SendInput(uint nInputs, INPUT64[] pInputs, int cbSize);
  8. const int cross = 4, cross64 = 8;
  9. .....
  10. [StructLayout(LayoutKind.Explicit)]
  11. private struct INPUT
  12. {
  13. [FieldOffset(0)]
  14. public int type;
  15. [FieldOffset(cross)]
  16. public MOUSEINPUT mi;
  17. [FieldOffset(cross)]
  18. public KEYBDINPUT ki;
  19. [FieldOffset(cross)]
  20. public HARDWAREINPUT hi;
  21. }
  22. [StructLayout(LayoutKind.Explicit)]
  23. private struct INPUT64
  24. {
  25. [FieldOffset(0)]
  26. public int type;
  27. [FieldOffset(cross64)]
  28. public MOUSEINPUT mi;
  29. [FieldOffset(cross64)]
  30. public KEYBDINPUT ki;
  31. [FieldOffset(cross64)]
  32. public HARDWAREINPUT hi;
  33. }
Sửa lần cuối bởi tienlbhoc vào ngày T.Tư 29/10/2008 5:55 pm với 5 lần sửa.
Diễn đàn và blog phần mềm tự làm :
http://my.opera.com/DienDanTienlbhoc/forums/
http://my.opera.com/tienlbhoc/blog/

Hình đại diện của người dùng
tiger86love102
Thành viên danh dự
Thành viên danh dự
Bài viết: 609
Ngày tham gia: CN 19/10/2008 1:10 am
Đến từ: http://ready.vn
Has thanked: 4 time
Been thanked: 21 time
Liên hệ:

Re: Tạo chương trình chỉ chạy 1 instance 1 lúc

Gửi bàigửi bởi tiger86love102 » T.Tư 29/10/2008 5:46 pm

Mình mới bắt đầu tự học VB.NET, thấy mấy bạn bàn luận cái ji mà sôi động thế, đọc cũng chẳng hiểu ji cả. :(
Cái Instance là cái ji vậy? Trong VB.NET có ko? :-S
Nó dùng để làm ji vậy các bạn? [-(
Đội bóng Ready
facebook.com/tiger86love102

Hình đại diện của người dùng
1045007
Thành viên danh dự
Thành viên danh dự
Bài viết: 551
Ngày tham gia: T.Hai 09/06/2008 3:35 pm
Đến từ: TP Cần Thơ
Has thanked: 2 time
Been thanked: 64 time
Liên hệ:

Re: Tạo chương trình chỉ chạy 1 instance 1 lúc

Gửi bàigửi bởi 1045007 » T.Tư 29/10/2008 6:11 pm

Đây! của Kỳ Nhông cao cấp nhận dc tham số lần 2.
Cái này dành cho người mới tìm hiểu, 1 Instance nghĩa là 1 thể hiện
Xem:
http://www.caulacbovb.com/forum/viewtopic.php?f=51&t=3862
Xếp hình cổ điển for Android-https://play.google.com
♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀

Hình đại diện của người dùng
tiger86love102
Thành viên danh dự
Thành viên danh dự
Bài viết: 609
Ngày tham gia: CN 19/10/2008 1:10 am
Đến từ: http://ready.vn
Has thanked: 4 time
Been thanked: 21 time
Liên hệ:

Re: Tạo chương trình chỉ chạy 1 instance 1 lúc

Gửi bàigửi bởi tiger86love102 » T.Năm 30/10/2008 3:34 pm

1045007 đã viết:Đây! của Kỳ Nhông cao cấp nhận dc tham số lần 2.
Cái này dành cho người mới tìm hiểu, 1 Instance nghĩa là 1 thể hiện
Xem:
http://www.caulacbovb.com/forum/viewtopic.php?f=51&t=3862


Quái thật em làm như bác bảo mà chẳng thấy hiện tượng ji khác biệt. Vẫn mỗi cái form trống trơn :-?
Em dùng VB.NET 2005 :-S
Đội bóng Ready
facebook.com/tiger86love102

tienlbhoc
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 415
Ngày tham gia: T.Bảy 14/07/2007 10:06 pm
Đến từ: Hà Nội
Been thanked: 1 time

Re: Tạo chương trình chỉ chạy 1 instance 1 lúc

Gửi bàigửi bởi tienlbhoc » T.Năm 30/10/2008 3:40 pm

dốt thế , build nó ra 1 file exe , nhấp chuột vào file đó nó ra cái form đương nhiên bình thường . Nếu giờ nhấp tiếp thì nó sẽ không ra cái chương trình khác (hiểu không) chỉ cho chạy 1 lần ứng dụng.
còn nếu không check thì nhấp bao nhiêu vào nó ra bấy nhiêu form
Diễn đàn và blog phần mềm tự làm :
http://my.opera.com/DienDanTienlbhoc/forums/
http://my.opera.com/tienlbhoc/blog/

Hình đại diện của người dùng
tiger86love102
Thành viên danh dự
Thành viên danh dự
Bài viết: 609
Ngày tham gia: CN 19/10/2008 1:10 am
Đến từ: http://ready.vn
Has thanked: 4 time
Been thanked: 21 time
Liên hệ:

Re: Tạo chương trình chỉ chạy 1 instance 1 lúc

Gửi bàigửi bởi tiger86love102 » T.Năm 30/10/2008 3:50 pm

Ah ra thế làm đc rồi =D>
Đã bao jo buid ji ji đâu mà biết, dám kêu em dốt :((
Giờ thì biết rồi, hết dốt rồi :))
Đội bóng Ready
facebook.com/tiger86love102

Hình đại diện của người dùng
clarkkent
Mạnh Thường Quân
Mạnh Thường Quân
Bài viết: 1641
Ngày tham gia: T.Tư 16/04/2008 11:25 am
Đến từ: Chợ Lách - Bến Tre
Been thanked: 31 time
Liên hệ:

Re: Tạo chương trình chỉ chạy 1 instance 1 lúc

Gửi bàigửi bởi clarkkent » T.Sáu 17/04/2009 1:04 pm

bắt chước VB6...

Mã: Chọn hết

  1. Public Class Form1
  2.     Function PrevInstance() As Boolean
  3.         If UBound(Diagnostics.Process.GetProcessesByName(Diagnostics.Process.GetCurrentProcess.ProcessName)) > 0 Then
  4.             Return True
  5.         Else
  6.             Return False
  7.         End If
  8.     End Function
  9.  
  10.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  11.         If PrevInstance() Then
  12.             MsgBox("Chạy chi 2 lần dữ vậy!!!")
  13.             End
  14.         End If
  15.     End Sub
  16. End Class
• Hôm bây: www.tinsoftware.com ^ ^
Cố gắng lên...


Quay về “[.NET] Bài viết hướng dẫn”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách