천객만래 [千客萬來] (It has an interminable succession of visitors)

Timer 클래스
- System.Windows.Forms.Timer

 

사용자가 정의한 간격마다 이벤트를 발생시키는 타이머를 구현합니다. 이 타이머는 Windows Forms 응용 프로그램에서 사용할 수 있도록 최적화되었으며 창에서 사용해야 합니다.

 

Timer는 사용자가 정의한 간격으로 이벤트를 발생시키는 데 사용됩니다. 이 Windows 타이머는 UI 스레드를 사용하여 프로세스를 수행하는 단일 스레드 환경용입니다. 이 타이머를 사용하려면 사용자 코드에 사용 가능한 UI 메시지 펌프가 있어야 하고 항상 같은 스레드에서 수행되거나 다른 스레드로 호출을 마샬링해야 합니다.

 

이 타이머를 사용할 때에는 Tick 이벤트를 사용하여 폴링 작업을 수행하거나 지정된 시간 동안 시작 화면을 표시합니다. Enabled 속성이 true로 설정되고 Interval 속성이 0보다 크면 항상 Interval 속성 설정을 기반으로 하는 간격에 따라 Tick 이벤트가 발생합니다.

 

이 클래스는 간격을 설정하고 타이머를 시작 및 중지할 수 있는 메서드를 제공합니다.

 

생성자
- public Timer();

 

속성
- Enabled : 타이머가 실행 중인지 여부를 나타내는 값을 가져오거나 설정합니다.
- Interval  : 타이머 틱 사이의 시간(밀리초)을 가져오거나 설정합니다.

 

메소드
- Start : 타이머를 시작합니다.
- Stop  : 타이머를 중지합니다

 

이벤트
- Tick : 지정된 타이머 간격이 경과되고 타이머를 사용할 수 있을 때 발생합니다.


사용예제
: 버튼 클릭시 타이머를 중지하거나 실행시킵니다.

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

 

namespace TimerTest
{
    public class Form1 : System.Windows.Forms.Form
    {
        private System.Windows.Forms.Button btnTime;
        private System.Windows.Forms.Timer timerNow;
        private System.Windows.Forms.Label lblTime;
        private System.ComponentModel.IContainer components;

 

        public Form1()
        {
            InitializeComponent();
        }

 

        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

 

        #region Windows Form 디자이너에서 생성한 코드
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.btnTime = new System.Windows.Forms.Button();
            this.timerNow = new System.Windows.Forms.Timer(this.components);
            this.lblTime = new System.Windows.Forms.Label();
            this.SuspendLayout();
            //
            // btnTime
            //
            this.btnTime.Location = new System.Drawing.Point(16, 48);
            this.btnTime.Name = "btnTime";
            this.btnTime.Size = new System.Drawing.Size(176, 23);
            this.btnTime.TabIndex = 1;
            this.btnTime.Text = "타이머 중지";
            this.btnTime.Click += new System.EventHandler(this.btnTime_Click);
            //
            // timerNow
            //

            this.timerNow.Interval = 1000;
            this.timerNow.Tick += new System.EventHandler(this.timerNow_Tick);
            //
            // lblTime
            //

            this.lblTime.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
            this.lblTime.Font = new System.Drawing.Font("굴림", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(129)));
            this.lblTime.Location = new System.Drawing.Point(16, 16);
            this.lblTime.Name = "lblTime";
            this.lblTime.Size = new System.Drawing.Size(176, 23);
            this.lblTime.TabIndex = 2;
            this.lblTime.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
            //
            // Form1
            //

            this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
            this.ClientSize = new System.Drawing.Size(208, 85);
            this.Controls.Add(this.lblTime);
            this.Controls.Add(this.btnTime);
            this.Name = "Form1";
            this.Text = "Timer테스트";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.ResumeLayout(false);

        }
        #endregion

 

        [STAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }

 

        //카운트 다운 숫자 표시 변수 선언
        private int countdown = 0;

 

        //Timer.Enabled이 true가 되면 Timer.Interval에서 지정해준 밀리초마다 아래 메소드 실행.

        private void timerNow_Tick(object sender, System.EventArgs e)
        {
            //지정해준 밀리초마다 라벨에 카운트 다운숫자값을 넣어줍니다.
            this.lblTime.Text = "카운트다운 : " + (countdown++);
        }

 

        //Timer가 시작된 상태에서 버튼을 클릭하면 타이머를 중지하고
        //Timer가 중지된 상태에서 버튼을 클릭하면 타이머를 계속 실행하는 메소드

        private void btnTime_Click(object sender, System.EventArgs e)
        {
            if(this.timerNow.Enabled)
            {
                //this.timerNow.Enabled = false;
                this.timerNow.Stop();
                this.btnTime.Text = "타이머 시작";
            }
            else
            {
                //this.timerNow.Enabled = true;
                this.timerNow.Start();
                this.btnTime.Text = "타이머 중지";
            }
        }

 

        //폼이 로드될때 타이머를 실행시킵니다.
        private void Form1_Load(object sender, System.EventArgs e)
        {
            //this.timerNow.Enabled = true;
            this.timerNow.Start();

        }
    }
}

Posted by SB패밀리

 http://blog.naver.com/tear230/100003039681

 

지금 키보드입력이 삽입상태인지 수정상태인지, Caps Lock이 켜져 있는지 꺼져있는지를

GetKeyState API를 이용 알아내는 방법입니다.

 

MFC가 그랬듯이 .NET Library가 Windows API를 완전히 표현하고 있지는 않는 것 같습니다.
그러나 C#에서 Unmanaged Code를 사용할 수 있으니까 Windows API를 직접 사용하면 되겠지요.    


 

using System.Runtime.InteropServices;
...

[DllImport("User32.dll")]
public static extern int MessageBox(int h, string m, string c, int type);


[DllImport("User32.dll")]
public static extern short GetKeyState(int nVirtualKey);

private void textBox1_TextChanged(object sender, System.EventArgs e)
{
     if ((GetKeyState(0x15) & 0x01) == 0x01) MessageBox(0, "Hangul Key", "Sunken", 0);
     if ((GetKeyState(0x14) & 0x01) == 0x01) MessageBox(0, "CapsLock Key", "Sunken", 0);
     if ((GetKeyState(0x90) & 0x01) == 0x01) MessageBox(0, "NumLock Key", "Sunken", 0);

자료출처 : http://www.devpia.com/

Posted by SB패밀리

 http://blog.naver.com/tear230/100002814790

using System;
using Microsoft.Win32;


// Microsoft.Win32 네임스페이스에서는 운영 체제에서 발생시킨 이벤트를
// 처리하는 클래스와 시스템 레지스트리를 관리하는 클래스의 두 가지 유형을 제공합니다.

 

class Reg {

    public static void Main() {

      // Registry 클래스 : 레지스트리의 값과 하위 키에 액세스하는 기본 Registrykeys를 제공.
      // RegistryKey : Windows레지스트리의 키수준노드. 이클래스는 레지스트리 캡슐화 클래스.
      
        RegistryKey rk = Registry.CurrentUser;

       // HKEY_CURRENT_USER에 액세스 할 RegistryKey의 객체생성 
        PrintKeys(rk);   // 해당 레지스트리키의 하위 키 목록을 뿌져주는 메소드

 

        /*
       
Registry.ClassesRoot
        - 해당 형식과 관련된 속성 및 문서의 형식 또는 클래스를 정의합니다.
        - Windows 레지스트리 기본 키 HKEY_CLASSES_ROOT

 

        Registry.CurrentConfig
        - 사용자와 관련되지 않은 하드웨어에 대한 구성 정보가 들어 있습니다.
        - Windows 레지스트리 기본 키 HKEY_CURRENT_CONFIG

 

        Registry.CurrentUser
        - 현재 사용자 기본 설정에 대한 정보가 들어 있습니다.
        - Windows 레지스트리 기본 키 HKEY_CURRENT_USER

 

        Registry.DynData
        - 동적 레지스트리 데이터가 들어 있습니다.
        -  Windows 레지스트리 기본 키 HKEY_DYN_DATA

 

        Registry.LocalMachine
        - 로컬 컴퓨터에 대한 구성 데이터가 들어 있습니다.
        - Windows 레지스트리 기본 키 HKEY_LOCAL_MACHINE

 

        Registry.PerformanceData
        - 소프트웨어 구성 요소에 대한 성능 정보가 들어 있습니다.
        - Windows 레지스트리 기본 키 HKEY_PERFORMANCE_DATA

 

        Registry.Users
        - 기본 사용자 구성에 대한 정보가 들어 있습니다.
        -  Windows 레지스트리 기본 키 HKEY_USERS
        */

 

        IESetup();  //익스플로러의  페이지 설정을 수정한다.

        Console.Read();     //실행화면 일시중지
    }

 

    static  void IESetup()
    {

        Console.WriteLine("\n * 아래는 익스플로러 메뉴의 페이지 설정부분을 변경합니다.");

 

        string strKey  =  @"Software\Microsoft\Internet Explorer\PageSetup";   
      
  // 익스플로러의 메뉴 -> 페이지 설정부분을 수정하기 위한 위치값 변수
        // 수정하고자하는 레지스트리 내용의 검색 및 확인 : 시작 -> 실행 - > regedit

        // 지정된 쓰기 권한을 사용하여 지정된 하위 키를 검색합니다


        RegistryKey oKey  = Registry.CurrentUser.OpenSubKey(strKey,true);
        // public RegistryKey OpenSubKey(string name, bool writable); 지정된 하위 키를 검색
        // name : 열려는 하위 키의 이름 또는 경로
        // writable : 키에 대한 쓰기 권한이 필요하면 true로 설정

        // public RegistryKey OpenSubKey(string); 하위 키를 읽기 전용으로 검색

 

        Console.WriteLine("-----------------변경전----------------------");
        Console.WriteLine("footer : {0} ", oKey.GetValue("footer"));
        Console.WriteLine("header : {0} ", oKey.GetValue("header"));
        Console.WriteLine("margin_bottom : {0} ", oKey.GetValue("margin_bottom"));
        Console.WriteLine("margin_left : {0} ", oKey.GetValue("margin_left"));
        Console.WriteLine("margin_right : {0} ", oKey.GetValue("margin_right"));
        Console.WriteLine("margin_top : {0} ", oKey.GetValue("margin_top"));

 

        oKey.SetValue("footer", "&p/&P");
        oKey.SetValue("header", "&w");
        oKey.SetValue("margin_bottom", "0");
        oKey.SetValue("margin_left", "0");
        oKey.SetValue("margin_right", "0");
        oKey.SetValue("margin_top", "0");
        // public void SetValue(string name, object value);  지정된 값을 설정합니다.

 

        /*
        * 익스플로러 페이지설정에서 머리글, 바닥글 값 설정시 사용하는 값종류
        -  &w : 창 제목
        -  &u : 페이지 주소(URL)
        -  &d : 제어판의 국가별 설정에서 지정한 간단한 형식의 날짜
        -  &D : 제어판의 국가별 설정에서 지정한 자세한 형식의 날짜
        -  &t : 제어판의 국가별 설정에서 지정한 서식으로 표시한 시간
        -  &T : 24시간제 서식으로 표시한 시간
        -  &p : 현재 페이지 번호
        -  &P : 전체 페이지 수
        -  &b : 오른쪽 맞춤 텍스트(앞에 &b)
        -  &b&b : 가운데 맞춤 텍스트(&b&b 사이)
        -  && : 단일 앰퍼샌드(&) 

 

        * 익스플로러 시작페이지 변경시 사용하는 레지스트리키
           -> HKEY_CURRENT_USER/Software/Microsoft/Internet Explore/Main의
Start Page

        */

 

        Console.WriteLine("-----------------변경후----------------------");
        Console.WriteLine("footer : {0} ", oKey.GetValue("footer"));
        Console.WriteLine("header : {0} ", oKey.GetValue("header"));
        Console.WriteLine("margin_bottom : {0} ", oKey.GetValue("margin_bottom"));
        Console.WriteLine("margin_left : {0} ", oKey.GetValue("margin_left"));
        Console.WriteLine("margin_right : {0} ", oKey.GetValue("margin_right"));
        Console.WriteLine("margin_top : {0} ", oKey.GetValue("margin_top"));

        //  String s = (String) oKey.GetValue("footer");
        //  public object GetValue(string  name); 지정된 값을 검색

 

        /*
        footer  : 바닥글
        header   : 머리글
        margin_bottom   : 아래쪽 여백
        margin_left : 왼쪽 여백
        margin_right    : 오른쪽 여백
        margin_top  : 위쪽여백
        */

 

        oKey.Close();
       
// 컨텐트를 수정후 키를 닫고 디스크에 플러시
        // 시스템키는 닫을수 없으므로 시스템키에서 이메서드를 호출하면 아무것도 수행되지 않음.

        // 이미 닫힌 RegistryKey의 인스턴스에서 이메서드를 호출하면 아무것도 수행되지 않음.

    }

 

    static void PrintKeys(RegistryKey rkey) {

        String [] names = rkey.GetSubKeyNames();
        // GetSubKeyNames : 모든 하위 키 이름이 포함된 문자열의 배열 검색.

        int icount = 0;

        Console.WriteLine( rkey.Name + "의 서브키 목록" );
       
// Name : 키 이름을 검색.
        // SubKeyCount : 현재 키에 대한 기본 수준의 하위 키 개수.
        // ValueCount : 키의 값 개수

        Console.WriteLine("-----------------------------------------------");

        foreach (String s in names) {
            Console.WriteLine(s);
            icount++;
            if (icount >= 10)
                break;
       }

       Console.WriteLine("-----------------------------------------------");
    }
}

Posted by SB패밀리

 http://blog.naver.com/tear230/100002806422

using System;
using System.Collections;


// System.Collections 네임스페이스에는 목록, 대기열, 비트 배열, 해시 테이블 및 사전과 같은
// 다양한 개체의 컬렉션을 정의하는 인터페이스와 클래스가 포함되어 있습니다.

 

class EnvironmentClass
{

    // Environment class 요약
   
// 현재 환경 및 플랫폼에 대한 정보 및 조작 방법을 제공. 이 클래스는 상속될 수 없습니다.

 

    public static void Main()
    {
        String str;
        String nl = Environment.NewLine;

        Console.WriteLine();
        Console.WriteLine("-- Environment 멤버--");

 

        // 프로세스에 대한 명령줄.
        Console.WriteLine("CommandLine: {0}", Environment.CommandLine);

 

        // 현재 프로세스에 대한 명령줄 인수가 들어 있는 문자열 배열을 반환.
        String[] arguments = Environment.GetCommandLineArgs();
        Console.WriteLine("GetCommandLineArgs: {0}", String.Join(", ", arguments));

 

       // 현재 디렉터리, 즉 이 프로세스가 시작된 디렉터리의 정규화된 경로를 가져와서 설정
        Console.WriteLine("CurrentDirectory: {0}", Environment.CurrentDirectory);

 

        // 프로세스의 종료 코드를 가져오거나 설정.
        Console.WriteLine("ExitCode: {0}", Environment.ExitCode);

 

        // 공용 언어 런타임의 종료 여부 또는 현재 응용 프로그램 도메인의 언로드 여부를 나타냄.

        Console.WriteLine("HasShutdownStarted: {0}", Environment.HasShutdownStarted);

 

       // 로컬 컴퓨터의 NetBIOS 이름을 가져온다.
        Console.WriteLine("MachineName: {0}", Environment.MachineName);

 

        //이 환경에 대해 정의된 줄 바꿈 문자열을 가져온다.
        Console.WriteLine("NewLine: {0}  first line{0}  second line{0}  third line", Environment.NewLine);

 

        // 현재 플랫폼 식별자와 버전 번호가 들어 있는 OperatingSystem 개체를 가져온다.
        Console.WriteLine("OSVersion: {0}", Environment.OSVersion.ToString());

 

        //현재 스택 추적 정보를 가져온다.
        Console.WriteLine("StackTrace: '{0}'", Environment.StackTrace);

 

        // 시스템 디렉터리의 정규화된 경로를 가져온다.
        Console.WriteLine("SystemDirectory: {0}", Environment.SystemDirectory);

 

        // 시스템 시작 이후 경과 시간(밀리초)을 가져온다.
        Console.WriteLine("TickCount: {0}", Environment.TickCount);

 

        // 현재 사용자와 관련된 네트워크 도메인 이름을 가져온다.
        Console.WriteLine("UserDomainName: {0}", Environment.UserDomainName);

 

        // 현재 프로세스가 사용자 대화형 모드로 실행되고 있는지 여부를 나타내는 값을 가져온다.
        Console.WriteLine("UserInteractive: {0}", Environment.UserInteractive);

 

       // 현재 스레드를 시작한 사람의 사용자 이름을 가져온다.
        Console.WriteLine("UserName: {0}", Environment.UserName);

 

        // 공용 언어 런타임의 주 번호, 보조 번호, 빌드 번호 및 수정 번호를 설명하는 Version 개체를 가져온다.
        Console.WriteLine("Version: {0}", Environment.Version.ToString());

 

        // 프로세스 컨텍스트에 매핑되는 실제 메모리의 크기를 가져온다
        Console.WriteLine("WorkingSet: {0}", Environment.WorkingSet);

 

        String query = "이 컴퓨터의 시스템 드라이브 :  %SystemDrive% ,  이 컴퓨터의 시스템 루트는  %SystemRoot%";

        // 지정된 문자열에 있는 각 환경 변수 이름을 해당 변수의 값에 해당하는 문자열로 바꾼 다음 결과 문자열을 반환.
        str = Environment.ExpandEnvironmentVariables(query);
        Console.WriteLine("ExpandEnvironmentVariables: {0}  {1}", nl, str);

 

        // 지정된 환경 변수의 값을 반환.
        Console.WriteLine("GetEnvironmentVariable: {0}  이컴퓨터의 임시디렉터리는 {1}.", nl, Environment.GetEnvironmentVariable("TEMP"));

 

        // 모든 환경 변수와 해당 값을 반환.
        Console.WriteLine("GetEnvironmentVariables: ");
        IDictionary environmentVariables = Environment.GetEnvironmentVariables();
        foreach (DictionaryEntry de in environmentVariables)
        {
            Console.WriteLine("  {0} = {1}", de.Key, de.Value);
        }

 

       // 현재 컴퓨터의 논리 드라이브 이름이 들어 있는 문자열의 배열을 반환.
        Console.WriteLine("GetFolderPath: {0}", Environment.GetFolderPath(Environment.SpecialFolder.System));

 

        // 현재 컴퓨터의 논리 드라이브 이름이 들어 있는 문자열의 배열을 반환.
        String[] drives = Environment.GetLogicalDrives();
        Console.WriteLine("GetLogicalDrives: {0}", String.Join(", ", drives));

 

        Environment.Exit(Environment.ExitCode); 
        // 이 프로세스를 종료하고 내부 운영 체제에 지정된 종료 코드를 제공.
        // public static void Exit(int exitCode); 
        // exitCode : 운영 체제에 제공되는 종료 코드.

 

        Console.Read(); //실행화면 일시 중지
        //상단에 프로세스종료코드가 실행되었으므로 Console.Read()는 실행되지 않는다.
    }
}

Posted by SB패밀리

 http://blog.naver.com/tear230/100002712722

HOWTO: System.Web.Mail 및
Visual C# .NET에서 프로그래밍 방식으로 전자 메일 보내기

 

요약

이 문서에서는 System.Web.Mail을 사용하여 Visual C#. NET에서 전자 메일 메시지를 보내는 방법을 설명합니다.

 

추가 정보

1. Microsoft Visual Studio .NET을 시작합니다. 파일 메뉴에서 새로 만들기를 누른 다음 프로젝트 누릅니다. Visual C# 프로젝트를 누르고 콘솔 응용 프로그램 템플릿을 누른 다음 확인을 누릅니다. 기본적으로 Class1.cs가 만들어집니다.

 

2. System.Web.dll에 대한 참조를 추가합니다. 다음과 같이 합니다.
   - 프로젝트 메뉴에서 참조 추가를 누릅니다.
   - .NET 탭에서 System.Web.dll을 찾아 선택 누릅니다.
   - 참조 추가 대화 상자에서 확인을 눌러 선택한 내용을 적용합니다. 
     선택한 라이브러리에 대해 래퍼를 생성할 것인지 묻는 메시지가 표시되면 예를 누릅니다.

 

3. 코드 창에서 전체 코드를 아래의 코드로 대체합니다.

 

using System;
using System.Web.Mail;

namespace WebMail
{
    class Class1
    {
        static void Main(string[] args)
        {
            try
            {
                MailMessage oMsg = new MailMessage(); 
               
// TODO: Replace with sender e-mail address.
                oMsg.From =
sender@somewhere.com;

                // TODO: Replace with recipient e-mail address.
                oMsg.To =
recipient@somewhere.com;
                oMsg.Subject = "Send Using Web Mail";   
          
               
// SEND IN HTML FORMAT (comment this line to send plain text).
                oMsg.BodyFormat = MailFormat.Html;
               
               
// HTML Body (remove HTML tags for plain text).
                oMsg.Body = "<HTML><BODY><B>Hello World!</B></BODY></HTML>";
               
              
  // ADD AN ATTACHMENT.
                // TODO: Replace with path to attachment.
                String sFile = @"C:\temp\Hello.txt"; 
                MailAttachment oAttch = new MailAttachment(sFile, MailEncoding.Base64);
 
                oMsg.Attachments.Add(oAttch);

                // TODO: Replace with the name of your remote SMTP server.
                SmtpMail.SmtpServer = "MySMTPServer";
                SmtpMail.Send(oMsg);

                oMsg = null;
                oAttch = null;
            }
            catch (Exception e)
            {
                Console.WriteLine("{0} Exception caught.", e);
            }
        }
    }
}

4. "TODO"가 나타나는 코드를 수정합니다.
5. F5 키를 눌러 프로그램을 빌드하고 실행합니다.
6. 전자 메일 메시지를 보내고 받았는지 확인합니다.

Posted by SB패밀리


아래 함수 예제는 x86과 x64 프로세서에 따라서 x86 프로그램의 Program Files 경로를 구해주는 함수입니다.


        /// <summary>
        /// get SpeicialFolder %ProgramFiles% of 32bit processor
        /// on 32bit : Program Files
        /// on 64bit : Program Files (x86)
        /// </summary>
        /// <returns></returns>
        static string ProgramFilesx86()
        {
            if (8 == IntPtr.Size
                || (!String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"))))
            {
                // %ProgramFiles% of 32bit processor
                return Environment.GetEnvironmentVariable("ProgramFiles(x86)");
                // 만약 64bit processor의 %ProgramFiles% 경로를 원하면
                // return Environment.GetEnvironmentVariable("ProgramW6432");
            }

            return Environment.GetEnvironmentVariable("ProgramFiles");

        }

Posted by SB패밀리

ProcessStartInfo.WorkingDirectory 속성


Using System.Diagnostics;

시작할 프로세스의 초기 디렉터리를 가져오거나 설정합니다

* UserNamePassword가 제공된 경우에는 WorkingDirectory 속성이 설정되어 있어야 합니다. 속성이 설정되어 있지 않으면 %SYSTEMROOT%\system32가 기본 작업 디렉터리가 됩니다.

디렉터리가 이미 시스템 경로 변수의 일부인 경우에는 이 속성에 디렉터리의 위치를 반복하여 지정할 필요가 없습니다.

WorkingDirectory 속성은 UseShellExecutefalse일 때보다 UseShellExecutetrue 일 때 다르게 동작합니다. UseShellExecutetrue이면 WorkingDirectory 속성은 실행 파일의 위치를 지정합니다. WorkingDirectory가 빈 문자열이면 현재 디렉터리는 해당 실행 파일을 포함하는 것으로 간주됩니다.

UseShellExecutefalse이면 WorkingDirectory 속성은 해당 실행 파일을 찾는 데 사용되지 않습니다. 대신 시작된 프로세스에서 사용되며 새 프로세스의 컨텍스트 내에서만 의미를 갖습니다.

출처 : MSDN

Posted by SB패밀리