2012년 10월 1일 월요일

1.1-2 BIOS, EFI

BIOS : Basic Input Output System
EFI : Extensible Firmware Interface

이번에는 컴퓨터 중에서도 PC(Personal Computer)에 대해서 본격적으로 알아보기로 하자.

먼저, PC의 구조에 대해서 간단하게 알아보자.
PC는 다른 컴퓨터들과는 확연히 다른 무엇인가가 있다.

냉장고는 오로지 냉장고의 온도조절 만을 한다.
세탁기는 세탁조안에 있는 빨래감을 세탁하는 것 만을 한다.
청소기는 바닥에 떨어져 있는 먼지를 제거하는 것 만을 한다.

그렇다면, PC는 어떤 것을 할 수 있는지 딱부러지게 말 할 수 있는가?
아쉽게도 말할 수 없다.

어떤 사람에게는 표계산을 전문적으로 하는 계산기이다.
어떤 사람에게는 책을 쓸 수 있는 디지털 타자기이다.
어떤 사람에게는 음악을 만들 수 있는 디지털 컴포저이다.
어떤 사람에게는 그림을 그릴 수 있는 디지털 캔버스이다.
어떤 사람에게는 게임을 즐겁게 할 수 있는 디지털 게임기이다.

그렇다. PC는 어떤 한가지 일을 하기 위해 만들어진 컴퓨터가 아니라는 것이다.
다른 컴퓨터와의 차이점이랄 수 있다.

실제로 PC를 통해서 우리가 무슨 일을 한다는 것은 결국 그것을 할 수 있도록 도와주는 프로그램(앱, 애플리케이션)을 실행(연다)한다는 것과 같다. 
이것이 다른 컴퓨터와 확연히 다른 것이다.

세탁기는 전원이 들어오면, 바로 세탁을 하기위해 만들어진 세탁전용 프로그램이 실행된다. 
그리고, 그 프로그램은 해당 세탁기를 만든 업체의 전문가가 아니면 바꿀 수 없다.

하지만, PC는 원하는 작업을 위해 원하는 프로그램을 설치하고 원하는대로 바꾸어서 실행하는 것이 가능하다.

대체 어떻게 이런 것이 가능할까 생각해 본적이 있는가?

그것을 가능하게 하는 것으로 운영체제(Windows, OSX. Linux. UNIX)라는 것이 있기 때문이다.

그런데, 다시 한번 더 생각해보자 우리는 우리가 가지고 있는 PC에 운영체제 조차도 필요에 따라 설치할 수 있다. 그렇다면, 운영체제의 앞에 무엇인가가 더 있다는 것을 생각할 수 있지 않을까? 그것이 지금 설명하고자 하는 BIOS라는 것이다.


세탁기나 텔레비전, 냉장고에도 BIOS와 비슷하게 생긴 것이 있다. 
하지만, 그러한 것들은 그것이 전부라는 것에 차이가 있다.

세탁기나 텔레비전과 같은 컴퓨터에 들어있는 그러한 것들을 Firmware라고 부른다. 
지금 설명하는 BIOS도 일종의 Firmware이다. 
그러면, Firmware가 무엇인지 알아보자.

백과사전(두산,네이버백과사전 참고)에는 “펌웨어는 일반적으로 롬(ROM)에 저장된 하드웨어를 제어하는 마이크로 프로그램을 의미한다.”라고 기록되어 있다.

하드웨어를 제어하는 프로그램이다. 
세탁기라면 세탁기라는 하드웨어를 제어하는 프로그램이다. 
따라서, 세탁기가 세탁기로써 제구실을 할 수 있도록 하는데 필수불가결한 요소라는 것을 알 수 있다.

그리고, 일반적으로 롬(ROM)에 저장되어 있다고 한다.
롬(Rean Only Memory)은 이름 그대로 읽기만이 가능한 기억장치라는 뜻으로 지우거나 수정하는 것을 허락하지 않는다는 것을 말한다.

말 그대로 세탁기의 Firmware의 내용을 지운다거나 수정하면 그 세탁기가 본래의 의도대로 동작하리라고 장담할 수 없다는 것이다. 일반적인 컴퓨터들은 이러한 Firmware에 저장된 프로그램이 그 기기의 전부를 말한다고 볼 수 있다.

이에 반해 PC는 그렇지 않다. 
PC도 컴퓨터이기에 반드시 이 Firmware가 필요하다. 
하지만, PC에 들어있는 Firmware가 PC의 본질을 정의하고 있지 않다는 것이 차이점이다. 

PC안에 내장된 Firmware가 하는 작업은 PC를 구성하고 있는 각종 하드웨어중에서 기본적으로 반드시 필요한 부품들의 상태를 검사한다. 

예를 든다면, CPU가 있는지, 메모리가 정상인지, 그래픽카드가 정상인지, 키보드가 연결되어 있는지 이러한 것들이 여기에 해당된다. 이러한 기본적인 하드웨어의 검사가 끝나면 운영체제를 찾아 그것을 실행함으로 자신의 일을 끝낸다.

간단히 설명하자면, PC에 내장된 Firmware는 그 PC전체를 제어하는데 목적이 있는 것이 아니라 운영체제를 실행하는데 그 목적이 있다는 것이다. 
운영체제의 실행이 성공하면 그것으로 PC의 Firmware의 주요 업무는 끝나는 것이다. 
PC의 Firmware를 BIOS라고 부르는 이유가 여기에 있다. 
이름 그대로 기본적인 입력과 출력을 관리하는 시스템이라는 의미이다.

좀 더 자세히 설명하자면, PC는 입력장치와 출력장치로 대부분의 하드웨어를 양분할 수 있다. 
이 두가지를 통해서 사용자인 사람과 혹은 다른 컴퓨터와 통신을 할 수 있게 되는 것이다.
바로 이 중간에서 입력장치와 출력장치의 중간에서 서로간의 연결만을 책임지는 시스템이 바로 BIOS라는 것이다.

최근에는 PC의 하드웨어가 점점 복잡해지고 다양해짐에 따라서 기존의 BIOS만으로는 해결하기 어렵거나 복잡해지는 상황들이 발생하기 시작했다. 
이를 대체하기 위해 개발되어지고 있는 것이 EFI라는 규격이다.

EFI(확장 펌웨어 인터페이스)는 1990년 인텔과 HP의 주도로 서버용 플랫폼을 위해 개발되기 시작했지만, 2002년 12월 인텔에의해 공개되면서 지금은 PC의 BIOS를 대체하는 규격으로 개발되고 있다.

1981년 IBM PC가 출시된 이후 2012년 현재까지 대부분 PC의 Firmware는 BIOS였다. 
하지만, 애플에서 출시되는 맥킨토시는 Firmware로 EFI를 사용하고 있고, PC에서도 고급형 모델에서부터 시작하여 EFI를 채택하고 있다.

윈도우즈 8 (2012년말에 출시)은 EFI를 메인보드의 Firmware로 사용하여 시스템 및 운영체제의 성능을 향상시키는 기능이 포함되어 있어 본격적으로 EFI가 BIOS를 대치하게 될 것이다.

2012년 9월 30일 일요일

1.1-1 마이크로 프로세서

2012년 현재, 우리 주위에 너무나도 다양한 형태로 컴퓨터라는 것들이 만들어지고 사용되어지는 시대에 살고 있다. 

오늘날 대부분의 가정(한국)에 컴퓨터 한 대 정도는 좋은 책상에 놓여져 있다. 
그뿐인가? 우리의 거실의 한쪽벽을 차지하고 있는 텔레비전도 스마트TV라는 이름으로 인터넷에 연결되어지고 있지 않은가? 스마트TV가 각광받기 전에는 각 통신사에서 가입해서 사용하는 셋톱박스 형태의 IPTV(VoIP TV)가 있었다. 
그것들도 컴퓨터이다. 

그러면, 컴퓨터에 대해서 좀더 정확히 집어보기로 하자.

컴퓨터에 대해서 얘기를 시작하는데, 뜬금없이 마이크로 프로세서를 첫번째 장의 천번째 단원의 첫 소제목으로 시작하고 있다. 

대체 마이크로 프로세서가 무엇이길래 이렇게 시작하고 있을까?


백과사전(두산,네이버백과사전 참고)을 보면 “컴퓨터의 산술논리연산기, 레지스터, 프로그램 카운터, 명령디코더, 제어회로 등의 연산장치와 제어장치를 1개의 작은 실리콘 칩에 모아놓은 처리장치를 말한다. 
주기억장치에 저장되어 있는 명령을 해석하고 실행하는 기능을 한다.”라고 기록되어 있다. 

그렇다. 컴퓨터의 여러가지 기능들을 한 개의 작은 실리콘 칩에 모아놓은 것이다. 
위 그림의 사작형의 작은 칩안에 산술처리, 명령처리, 제어회로, 연산장치, 제어장치들이 모두 들어있다는 것이다. 

 

보통 사람들은 컴퓨터하면 가정이나 사무실의 책상에 놓여있는 데스크탑 컴퓨터나 랩탑(노트북)컴퓨터를 생각한다. 
하지만, 엄밀히 말하면 그것들은 개인용 컴퓨터(Personal Computer)라고 해야 정확한 표현이다.

그렇다면, PC라는 이 단어에는 Personal이 아닌 다른 Computer가 있다는 것을 말해주고 있는 것이다. 정확히 말하면 바로 전에 언급한 이 마이크로 프로세서가 들어가 있는 모든 기기들이 바로 컴퓨터들이라는 것이다.
사실, 우리가 사용하는 PC에도 똑같이 이 마이크로 프로세서가 들어있다. 
PC에는 대부분 Intel사에서 개발한 마이크로 프로세서(X86계열의 CPU라고 부르는)가 들어있다. 

결국, 모든 컴퓨터에는 이 마이크로 프로세서라는 것이 들어 있다는 것이다. 

마이크로 프로세서는 다양한 종류가 있고 다양한 회사들에서 개발하고 제조하고 있다.

세탁기에도, 텔레비전에도 ,디지털 카메라에도, 프린터에도, 복사기에도, 냉장고에도, 에어콘에도, 청소기에도 하다못해 리모컨에도 들어있다. 그리고, 우리가 매일 수없이 타고 다니는 자동차에도 들어있다.
지금 우리는 마이크로 프로세서 속에서 살고 있는 것이나 다름없다.

21세기가 되면서 새롭게 다시 떠오르고 있는 유비쿼터스 네트워크라는 개념이 있다.
백과사전 (두산,네이버백과사전 참고) 에는 “사용자가 네트워크나 컴퓨터를 의식하지 않고 장소에 상관없이 자유롭게 네트워크에 접속할 수 있는 정보통신 환경”이라고 요약되어 있다.

방금 설명한 바로 이 마이크로 프로세서가 탑재된 장치들 하나하나가 모두 컴퓨터라면 거의 비슷한 환경이라고 볼 수도 있다. 
이제는 이러한 마이크로 프로세서를 탑재한 컴퓨터들이 모두 네트워크에 연결되면 비로서 유비쿼터스 네트워크 환경이라고 할 수 있게 되는 것이다.

그리고, 실제로 조금씩이지만 인터넷에 연결되는 냉장고, 보일러, 경보장치, 보안 카메라 등이 개발되고 출시되고 있다.



다음은 PC의 Firmware라고 할 수 있는 BIOS에 대해서 다룹니다.
컴퓨터 시스템, 특히 PC(Personal Computer)에 대한 모든 것을 다루고자 합니다.
나중에 강의 및 교육을 위한 자료로써 정리하고 있습니다.

2011년 8월 3일 수요일

WPF에서 타이머개체 사용하기

1. WPF자체의 타이머가 이닌 Windows.Form의 타이머를 사용하는 방법
using System.Windows.Forms;


// Timer개체를 생성, 속성, 이벤트 정의
timer = new Timer();
timer.Interval = 200;
timer.Tick += new EventHandler(timer_Tick);
timer.Enabled = true;


// 타이머의 Tick 이벤트
private void timer_Tick(object sender, EventArgs e)
{
            DrawClock();
}
/// 이코드는 Shape로 만들어진 시계의 시, 분, 초 침을 현재 시간에 맞추어
/// 각도를 조정하는 코드이다.
///   첨부한 샘플을 참고하라.


/// <summary>
/// 시침, 분침, 초침 그리기
/// </summary>
private void DrawClock()
{
            DateTime now = DateTime.Now;
            txtTime.Text = now.ToLongTimeString();
            int hour = now.Hour;
            int minute = now.Minute;
            int second = now.Second;
            double hourAngle = hour * 30 + minute * 0.5;
            double minuteAngle = minute * 6 + second * 0.1;
            double secondAngle = second * 6;
            rotateHour.Angle = hourAngle;
            rtHour.RenderTransform = rotateHour;
            rotateMinute.Angle = minuteAngle;
            rtMinute.RenderTransform = rotateMinute;
            rotateSecond.Angle = secondAngle;
            rtSecond.RenderTransform = rotateSecond;
}

2. WPF자체의 타이머를 사용하는 방법
이것은 윈폼용과 동일하게 동작합니다.
이벤트도 같구요. 다만, Enabled가 이니라 Start(), Stop()이네요.

public DispatcherTimer Timer = new DispatcherTimer();
void Window1_Loaded(object sender, RoutedEventArgs e)
{
    Timer.Interval = TimeSpan.FromSeconds(3);
    Timer.Tick += new EventHandler(Timer_Tick);
    Timer.Start();
}


3. 별도의 쓰레드를 만들어 동작하는 타이머를 사용하는 방법
Thread로 동작하는 것 같더군요. 따라서, 폼 개체에 접근할 수 없습니다.
this 라던가.. 폼 개체에 접근하려면 에러가 발생합니다.


사용방법은 using System.Timers; 를 추가하고 그냥 사용하시면 됩니다.
다만, Tick 이벤트가 아니라
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
Elapsed 이벤트를 사용합니다. 이벤트 핸들러도 다릅니다.
참고하세요.

System.Timers.Timer Class는 TestWindow와 다른 새로운 Thread를 생성해서 동작을 합니다.
System.Windows.Threading.DispatcherTimer는 TestWindow와 같은 Thread에서 동작을 합니다.


WPF용으로는 두가지의 타이머가 있습니다.
이 두가지 타이머간에는 다음과 같은 차이점이 존재합니다..


Dispatcher Class
 - 같은 Thread에서 동작하기 때문에 동기화 작업이 필요없고, TestWindow의 멤버도
   자유롭게 접근 가능합니다.

Timer Class
 - 서로 다른 Thread에서 동작하기 때문에 TestWindow의 멤버변수에 직접 접근을 할수 없습니다.
    (직접 접근을 하기 위해서는 Invoke나 BeginInvoke를 사용하여야 합니다)
 - 서로 다른 Thread에서 동작하기 때문에 List를 추가/삭제 하기 위해서는 추가적으로 Thread간
   동기화 작업을 해줘야 합니다.

현재 작업경로 가져오기

현재 작업 디렉토리의 졍규화된 경로를 가져옵니다.

System.Environment.CurrentDirectory

결과값에는 "\"는 포함되지 않습니다.
따라서, System.Environment.CurrentDirectory + "\\" + txtFileName.Text; 와 같이 사용해야 합니다.

아무데나 눌러서 창을 이동할때

타이틀이 없는 창을 이동하는 방법

Win32나 MFC등에서는 보통 이러한 경우 창 이동과 관련된 부분을 직접 구현 해야 하지만 WPF에서는 이러한 상황 에서 개발자의 부담을 덜어드리고자 간단한 메서드 호출 한번으로 마우스를 사용한 창 이동 기능을 구현 할 수 있습니다. 

Window Class에서 DragMove 메서드를 제공하는데요, 이 는 마우스 왼쪽 단추를 누른 상태로 창 클라이언트 영역의 노출된 영역에서 창을 끌 수 있도록 돕습니다. 사용방법이 매우 간단합니다. 

마우스를 사용해서 창을 끌 수 있도록 하고 싶은 객체의 MouseLeftButtonDown이벤트에 DragMove()메서드를 호출해주기만 하면 됩니다. 

void Window1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)     this.DragMove();}

외부의 프로세스(앱)을 호출(실행)하고 태스크를 관리할때

외부의 프로그램을 실행하는 코드입니다.
System.Diagnostics.Process.Start("Shutdown.exe", "-s -f -t 00");         // 시스템 종료
System.Diagnostics.Process.Start("Shutdown.exe", "-r -f -t 00");          // 시스템 다시 시작

System.Diagnostics의 Process 개체로 노트패드 프로세스를 생성하여 실행합니다.
Process myProcess = new Process();
myProcess.StartInfo.FileName = "Notepad";
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
myProcess.Start();

나중에 강제로 중지시키거나 정보를 검색할 수 있습니다.
myProcess.CloseMainWindow();

응답의 유무를 검사하여 정상종료와 강제종료를 할 수 있습니다.
If myProcess.Responding Then
    myProcess.CloseMainWindow()
Else
    ' Forces the process to close if the Responding value is False.
    myProcess.Kill()
End If

실행중인 모든 프로세스를 검색할 수 있습니다.
Process[] myProcesses = Process.GetProcesses();
foreach (Process myProcess in myProcesses)
{
      Console.WriteLine(myProcess.ProcessName);
}

프로세스 이름으로 현재 실행중인 프로세스를 가져올 수 있습니다.
myProcesses = Process.GetProcessesByName("Notepad");

아이콘파일, 실행파일에서 아이콘 가져오기

파일관리자 같은 앱을 만들다보면 꼭 필요하지요...


/// System.Drawing.Icon을 이용하여 아이콘을 추출하는 함수
public System.Windows.Media.ImageSource getIcon(string filename)
{
            System.Windows.Media.ImageSource icon;
            using (System.Drawing.Icon sysicon = System.Drawing.Icon.ExtractAssociatedIcon(filename))
            {
                icon = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(
                            sysicon.Handle,
                            System.Windows.Int32Rect.Empty,
                            System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
            }
            return icon;
}

// 이렇게 사용하세요. 아이콘파일의 기본 크기는 32이니깐...
private void button5_Click(object sender, RoutedEventArgs e)
{
            image1.Source = getIcon(textBox1.Text);
            image1.Width = 32;
            image1.Height = 32;
}

당연하겠지만, 이코드를 사용하려면 System.Drawing을 참조추가해야만 하겠죠?


getIcon(textBox1.Text) 에서 textBox1.Text는 추출하고자 하는 파일의 실제경로(FullPath)이어야 합니다.
경로가 틀리면 에러가 발생하겠죠?

using (System.Drawing.Icon sysicon = System.Drawing.Icon.ExtractAssociatedIcon(filename))
이 줄에서 에러가 발생합니다. 

실제 사용하려면 에러 핸들러를 달거나, 파일유무를 검사하면 되겠죠...

최소화할때 태스크바의 Notify 아이콘에 넣기

프로그램을 최소화할때 태스크바의 NotifyIcon으로 등록하는 방법 public partial class Window1 : System.Windows.Window { public Window1() { InitializeComponent(); System.Windows.Forms.NotifyIcon ni = new System.Windows.Forms.NotifyIcon(); ni.Icon = new System.Drawing.Icon("Main.ico"); ni.Visible = true; ni.DoubleClick += delegate(object sender, EventArgs args) { this.Show(); this.WindowState = WindowState.Normal; }; } protected override void OnStateChanged(EventArgs e) { if (WindowState == WindowState.Minimized) this.Hide(); base.OnStateChanged(e); } }
트레이 아이콘에서 제거 하고 싶으면 NotifyIcon 클래스의 Visible 프로퍼티를 조작한다.
ni.Visible = false;

원도우즈의 시스템 경로를 찾을 때...

// 선택한 경로가 없다면 시스템의 내 그림 폴더로 이동, 향후 마지막 사용한 폴더로 이동 기능 구현
nowPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyPictures);

아래는 SpecialFolder의 타입을 찾기위한 Enum 목록입니다.

        //     시스템 특수 폴더에 대한 디렉터리 경로를 검색하는 데 사용되는 열거 상수를 지정합니다.
        public enum SpecialFolder
        {
            //     실제 파일 시스템 위치가 아니라 논리 데스크톱입니다.
            Desktop = 0,
            //     사용자 프로그램 그룹이 들어 있는 디렉터리입니다.
            Programs = 2,
            //     문서에 대한 공용 리포지토리로 사용되는 디렉터리입니다.
            Personal = 5,
            //     "내 문서" 폴더입니다.
            MyDocuments = 5,
            //     사용자가 즐겨찾는 항목에 대한 공용 리포지토리로 사용되는 디렉터리입니다.
            Favorites = 6,
            //     시작 프로그램 그룹에 해당하는 디렉터리입니다.
            Startup = 7,
            //     사용자가 가장 최근에 사용한 문서가 들어 있는 디렉터리입니다.
            Recent = 8,
            //     보내기 메뉴 항목이 들어 있는 디렉터리입니다.
            SendTo = 9,
            //     시작 메뉴 항목이 들어 있는 디렉터리입니다.
            StartMenu = 11,
            //     "내 음악" 폴더입니다.
            MyMusic = 13,
            //     데스크톱에서 실제로 파일 개체를 저장하는 데 사용되는 디렉터리입니다.
            DesktopDirectory = 16,
            //     "내 컴퓨터" 폴더입니다.
            MyComputer = 17,
            //     문서 템플릿에 대한 공용 리포지토리로 사용되는 디렉터리입니다.
            Templates = 21,
            //     현재 로밍 사용자의 응용 프로그램 관련 데이터에 대한 공용 리포지토리로 사용되는 디렉터리
            ApplicationData = 26,
            //     현재 로밍하지 않은 사용자가 사용하는 응용 프로그램 관련 데이터에 대한 공용 리포지토리
            LocalApplicationData = 28,
            //     임시 인터넷 파일에 대한 공용 리포지토리로 사용되는 디렉터리입니다.
            InternetCache = 32,
            //     인터넷 쿠키에 대한 공용 리포지토리로 사용되는 디렉터리입니다.
            Cookies = 33,
            //     인터넷 기록 항목에 대한 공용 리포지토리로 사용되는 디렉터리입니다.
            History = 34,
            //     모든 사용자가 사용하는 응용 프로그램 관련 데이터에 대한 공용 리포지토리로 사용되는 디렉터리
            CommonApplicationData = 35,
            //     시스템 디렉터리입니다.
            System = 37,
            //     프로그램 파일 디렉터리입니다.
            ProgramFiles = 38,
            //     "내 그림" 폴더입니다.
            MyPictures = 39,
            //     전체 응용 프로그램에서 공유되는 구성 요소에 대한 디렉터리입니다.
            CommonProgramFiles = 43,
        }

WPF에는 DoEvents가 없습니다. 이걸로 해보세요...

DoEvents가 필요로 하는 위치에 아래 코드를 그대로 넣으세요.

Application.Current.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Background, new System.Threading.ThreadStart(delegate { }));

VB나 Window.Form에서는 DoEvent를 이용하면 되는데.. WPF는 그게 없습니다..
대신 다른 대안으로 사용할 수 있는 코드립니다.

어떻게 동작되는 건지 제게 물어봐도 전 모릅니다...
그냥, 사용할 뿐... ^^

WPF 애플릿에서 멀티모니터 지원

기존의 닷넷 프로그래밍에서는 System.Windows.Forms.SystemInformation.MonitorCount를 이용해서 현재 시스템에 장착된 모니터의 갯수를 알 수 있었다. 

또 해당되는 모니터의 상세한 정보를 얻고자 할 경우에는 System.Window.Forms.Screen.AllScreens[index].WorkingArea;와 같이 해당되는 모니터의 정보를 알아낼 수 있었다.
하지만 WPF에서는 기본적으로 모니터와 관련된 속성이나 기능을 추가로 제공되지 않는 것 같다.

실제로 몇몇 경우에는 듀얼 모니터를 활용하는 경우가 많고 또 개발시에도 듀얼 모니터를 이용하는 경우가 많기 때문에 WPF Application의 출력 모니터 지정은 꼭 필요한 기능중에 하나이다.

아래와 같은 코드를 이용하면 이와 같은 상황을 해결할 수 있다.

fullScreenWindow.WindowStartupLocation = WindowStartupLocation.Manual;
System.Drawing.Rectangle workingArea = System.Windows.Forms.Screen.AllScreens[1].WorkingArea;
fullScreenWindow.Left = workingArea.Left;
fullScreenWindow.Top = workingArea.Top;
fullScreenWindow.Width = workingArea.Width;
fullScreenWindow.Height = workingArea.Height;
fullScreenWindow.WindowState = WindowState.Maximized;
fullScreenWindow.WindowStyle = WindowStyle.None;
fullScreenWindow.Topmost = true;
fullScreenWindow.Show();

WindowStartupLocation을 메뉴얼로 지정해야 위치를 지정하기 용의하며 위의 소스의 핵심은
System.Drawing.Rectangle workingArea = System.Windows.Forms.Screen.AllScreens[1].WorkingArea; 이다.

AllScreens[1]이라고 했기 때문에 이는 Primary Monitor가 아닌 Second Monitor의 정보를 가져와서 임시라 Ractangle을 하나 생성하고 이 정보를 바탕으로 출력하려고 하는 WPF Window를 셋팅한다.

위 소스를 사용하려면,
System.Windows.Forms와 System.Drawing 두개의 NET Component를 참조 추가해야만 사용할 수 있습니다.

[참고]
단순히 멀티 모니터 전체를 덮는 창을 설정하려면, 이렇게 하세요.
this.WindowStartupLocation = WindowStartupLocation.Manual;
this.Left = 0;
this.Top = 0;
this.Width = SystemParameters.VirtualScreenWidth;
this.Height = SystemParameters.VirtualScreenHeight;
this.WindowStyle = WindowStyle.None;
this.Topmost = true; 
this.Show();

SystemParameters.VirtualScreenWidth;
SystemParameters.VirtualScreenHeight;
이 두 가지에는 멀티 모니터 전체의 크기가 계산된 값이 저장되어 있습니다.
이 경우, 1번 모니터의 Left, Top이 0 즉, 가장 왼쪽, 상단에 있어야만 정상적으로 표시될 것입니다.

실버라이트에서 투명배경 적용

실버라이트를 웹 페이지에 올릴때 배경을 투명하게 할 때에는 아래와 같이 3가지 속성을 바꿔주세요.

<asp:Silverlight ID="Silverlight_SearchEngine" runat="server" Source="~/ClientBin/COS_SHOP.SILVERLIGHT.xap" MinimumVersion="2.0.31005.0" Width="100%" Height="100%" PluginBackground="Transparent" BackColor="Transparent" Windowless="true" />

대한민국 주민번호 검증 코드

주민번호를 파라미터와 함께 넘겨주면 주민번호를 검사하여 리턴해 주는 함수입니다.
이 함수도 인터넷 어딘가에서 구한 것인데...
필요할 때 유용하게 잘 사용하고 있습니다. ^^

bool IsAvailableRRN(string RRN)
{
    //공백 제거
    RRN = RRN.Replace(" ", "");
    //문자 '-' 제거
    RRN = RRN.Replace("-", "");
    //주민등록번호가 13자리인가?
    if (RRN.Length != 13)
    {
        return false;
    }

    int sum = 0;
    for (int i = 0; i < RRN.Length - 1; i++)
    {
        char c = RRN[i];
        //숫자로 이루어져 있는가?
        if (!char.IsNumber(c))
        {
            return false;
        }
        else
        {
            if (i < RRN.Length)
            {
                //지정된 숫자로 각 자리를 나눈 후 더한다.
                sum += int.Parse(c.ToString()) * ((i % 8) + 2);
            }
        }
    }
    // 검증코드와 결과 값이 같은가?
    if (!((((11 - (sum % 11)) % 10).ToString()) == ((RRN[RRN.Length - 1]).ToString())))
    {
        return false;
    }
    return true;
}

저의 자료창고를 만들었습니다. ^^

앞으로 이곳을 통해
내 개인적인 글부터...
공부한 것들...
잊어버리지 않기 위해 필요한 것들...
그리고...
연구하고 개발하면서 만들어낸 결과물들...

다양한 자료들을 기록할 것입니다.
또한, 여기에다 넓은 인터넷에서 구한 자료들도 첨부하여 기록할 것입니다.

이곳을 통해서 저 뿐 아니라 이곳에 방문한 모든 이에게 도움이 되기를 바랍니다.
사랑하고 축복합니다.