posted by 방랑군 2012. 1. 13. 20:30

윈도우 7 기준

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin 폴더로 이동

AxImp.exe 명령을 이용해 shdocvw.dll 을 등록하면, SHDocVW 와 AxSHDocVW 를 함께 등록한다.

AxImp %Windir%\System32\shdocvw.dll

이렇게 하면 AxSHDocVw.DLL이 생성되는 것을 확인할 수 있다.

posted by 방랑군 2012. 1. 13. 20:01

Blinking in task bar like a MSN messenger

 

이번 강좌의 주제는 “MSN 메신저 스타일의 Task Bar 점멸 기능 넣기입니다.

MSN이나 네이트온 메신저는 새로운 친구가 접속 하거나 새로운 메시지가 도착하면  가지 방법으로 사용자에게 알려주는데  중에 좌측의 시스템 트레이에서 조그만 창이 스르르 올라 오는 기능을 구현 하는 것은 많이 알려져 있습니다만 Task Bar 해당 프로그램의  이름이 점멸하는 기능을 구현 하는 것은 상대적으로  알려져 있지 않은  같아 간단한 강좌를 작성 했습니다.

간단한 기능이므로 필요한 기능만 언급할 것입니다덕분에 강좌의 길이도 작습니다.

 필요한 기능인데 구현 방법을 알지 못해  고생 하는 개발자에게 도움이 되길 바랍니다.

 

[알아두세요]

1.        강좌에서 만들어진 예제는 Windows XP Professional SP2에서 테스트되었습니다.

2.        강좌는 .NET Framework 2.0 Visual Studio 2005 기준으로 제작되었습니다.

3.        강좌에서 사용된 개발 도구와 언어는  Visual Studio 2005 C#입니다.

 

1.       어떤 기능을 구현  것인가?

많은 메신저들이 새로운 메시지가 도착하거나 친구가 접속 했을  사용자에게 알려주기 위해 Task Bar 점멸 기능을 사용합니다 강좌는 메신저를 만들기 위한 강좌는 아니므로 단지 필요한 기능만을 습득하기 위해 샘플 어플리케이션이  활성화되고 일정 시간(5) 경과해도 활성화 되지 않으면 강제로 Task Bar에서 해당 어플리케이션 부분이 점멸하는 기능을 구현  것입니다(그림 1).

 

[그림 1]

 

2.       핵심 API

Task Bar 점멸 기능을 구현하기 위해서는 API 이용하는 방법이 가장 쉽습니다물론  번의 삽질로도 C# 코드만으로 구현이 가능하겠지만 이미 있는 기능 사용하는 것이 수명 연장에도 도움이 되겠죠해당 API 선언부를 알아보겠습니다. MSDN 있는 내용 그대로입니다.

 

FlashWindowEx

Flashes the specified window. It does not change the active state of the window.

BOOL FlashWindowEx)

   PELASHWINFO pfwi

);

Parameters

pfwi

   [in] A pointer to a FLASHWINFO structure.

Return Values

The return value specifies the window’s state before the call to the FlashWindowEx function. If the window caption was drawn as active before the call, the return value is nonzero. Otherwise, the return value is zero.

 

C#에서 사용하기 위한 선언도 알아보죠필요한 상수도 함께 알아보겠습니다.

[StructLayout(LayoutKind.Sequential)]

public struct FLASHWINFO

{

    public UInt16 cbSize;

    public IntPtr hwnd;

    public UInt32 dwFlags;

    public UInt16 uCount;

    public UInt32 dwTimeout;

}

 

private const UInt32 FLASHW_STOP = 0;

private const UInt32 FLASHW_TRAY = 2;

 

[DllImport("user32.dll")]

static extern Int16 FlashWindowEx(ref FLASHWINFO pwfi);

 

3.       간단한 샘플을 만들어보자.

API 모양새를 둘러 보았으니 간단하게 맛보기 샘플을 만들어 보겠습니다. API 어떤 방식으로 동작하는지를 알아보기 위한 것이니 단순하게 API 호출하고 어플리케이션이 어떻게 반응하는지 살펴보겠습니다.

 

Step 1. 윈도우 어플리케이션 프로젝트를 하나 만듭니다.

 

Step 2. 메인  클래스에 위의 API 선언부를 전부 복사  넣습니다.

 

Step 3.  위에 버튼 컨트롤을 하나 배치합니다.

 

Step 4. 버튼의 클릭 이벤트 핸들러에 API 호출하는 코드를 삽입합니다(소스 1).

private void button1_Click(object sender, EventArgs e)

{

    FLASHWINFO fInfo = new FLASHWINFO();

 

    fInfo.cbSize = (ushort)Marshal.SizeOf(fInfo);

    fInfo.hwnd = this.Handle;

    fInfo.dwFlags = FLASHW_TRAY;

    fInfo.uCount = UInt16.MaxValue;

    fInfo.dwTimeout = 0;

 

    FlashWindowEx(ref fInfo);

}

[소스 1]

 

Step 5. 빌드 하고 실행한  버튼을 누르면 Task Bar 해당 어플리케이션 이름 부분이 점멸합니다.

 

4.       어플리케이션 비활성화 알림 기능을 구현  보자.

테스트로 간단한 어플리케이션을 만들어 보았으니 이제 조금  복잡한 기능을 가진 어플리케이션을 만들어 보겠습니다.

제작할 어플리케이션이 가지게  기능은 폼이 비활성화되고 5초가 지나도 활성화 되지 않으면 Task Bar에서 점멸하여 사용자에게 알려주는 기능입니다.

 

Step 1. 윈도우 어플리케이션 프로젝트를 하나 만듭니다.

 

Step 2. 메인  클래스에 위의 API 선언부를 전부 복사  넣습니다.

 

Step 3. Timer 하나 추가하고 Interval 5000으로 설정합니다.

 

Step 4. 폼의 Deactivate 이벤트 핸들러에 타이머를 시작하는 코드를 삽입합니다(소스 2).

private void Form1_Deactivate(object sender, EventArgs e)

{

    this.timer1.Start();

}

[소스 2]

 

Step 5. 타이머의 Tick이벤트 핸들러에 점멸 기능을 활성화 시키는 API 호출 코드를 삽입합니다(소스 3).

private void timer1_Tick(object sender, EventArgs e)

{

    FLASHWINFO fInfo = new FLASHWINFO();

 

    fInfo.cbSize = (ushort)Marshal.SizeOf(fInfo);

    fInfo.hwnd = this.Handle;

    fInfo.dwFlags = FLASHW_TRAY;

    fInfo.uCount = UInt16.MaxValue;

    fInfo.dwTimeout = 0;

 

    FlashWindowEx(ref fInfo);

}

 

Step 6. 폼의 Activate 이벤트 핸들러에 타이머를 정지하고 점멸 기능을 비활성화 시키는 API 호출 코드를 삽입합니다(소스 4).

private void Form1_Activated(object sender, EventArgs e)

{

    this.timer1.Stop();

    FLASHWINFO fInfo = new FLASHWINFO();

 

    fInfo.cbSize = (ushort)Marshal.SizeOf(fInfo);

    fInfo.hwnd = this.Handle;

    fInfo.dwFlags = FLASHW_STOP;

    fInfo.uCount = UInt16.MaxValue;

    fInfo.dwTimeout = 0;

 

    FlashWindowEx(ref fInfo);

}

 

Step 7. 빌드하고 실행합니다테스트  보면 Minimize 버튼을 클릭하거나 다른 어플리케이션을 활성화해서 폼이 비활성화되면 5  Task Bar에서 점멸 기능이 동작 하고 폼을 활성화시키면 점멸 기능이 멈추는 것을   있습니다(그림 2).

 

[그림 2]

 

5.       마무리

FlashWindowEx 동일한 기능을 가진 API로는 FlashWindow 있습니다사용법이 훨씬 간단하므로 단순한 기능을 원한다면 사용에 무리는 없습니다하지만 점멸 간격 등의 정교한 제어를 원한다면 FlashWindowEx API 사용하는 것이 좋습니다파라메터에 해당하는 FLASHWIFO 구조체의 값을 적절히 바꾸어보면서 기능을 살펴보면 정확한 사용법을   있을 것입니다.

 

 

 

 

====================================

서용혁 (hyuki, mvp, c#)

crazy for .NET

Visual Studio 2005, .NET Framework, C#, MSDN Magazine

 

http://www.clrlab.org

====================================

posted by 방랑군 2012. 1. 13. 19:55

참조 :   http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=18&MAEULNo=8&no=1774&ref=1774 

1. WinAPI를 사용한다.

2. ShowWithoutActivation 프로퍼티를 상속받아서 Child Form Class를 구현한다.

 

 

그럼 차례대로 소개하도록 하겠습니다. 그리 어렵지 않습니다.

 

 

 

1. WinAPI - ShowWindow함수 사용

 

[System.Runtime.InteropServices.DllImport("user32.dll")]

public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

 

//RecvMemoWnd가 Form입니다. (쪽지창)

RecvMemoWnd memo = new RecvMemoWnd (strTitle, strContent, strTime, strSender);

ShowWindow(memo .Handle, WM_SHOWNOACTIVATE); //WM_SHOWNOACTIVATE = 4

 

 

 

2. 닷넷 - ShowWithoutActivation를 오버라이드하는 Child Form Class

 

public class Test : Form

{

   bool showWithoutActivation = false;

   protected override bool ShowWithoutActivation

   {

      get

      {

         return showWithoutActivation;

      }
   }

 

   public void Show(bool activate)

   {

      showWithoutActivation = !activate;

      Show();
   }
}

 

--------------------------------------------------------------------

 

Test test = new Test();

test.Show(false); 
posted by 방랑군 2012. 1. 7. 16:57

출처 :  http://blog.naver.com/PostView.nhn?blogId=alfustnals&logNo=140142248773&categoryNo=41&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=search

간단예제

  static void Main(string[] args)
 {
    string[] input { "도망노비님의", 
                           "블로그입니다", 
                           "사랑해주세여^^"};

    List<string> listTest = new List<string>(input);

    Console.WriteLine("1번 : \nCapacity: {0}", listTest.Capacity);

    Console.WriteLine();
    foreach (string lst in listTest)
    {
        Console.WriteLine(lst);
    }

    Console.WriteLine("\n");
    listTest.AddRange(listTest);

    Console.WriteLine();


    foreach (string lst in listTest)
    {
        Console.WriteLine("2번 :" + lst);
    }

    Console.WriteLine("\nRemoveRange(2, 2)");
    listTest.RemoveRange(2, 2);

    Console.WriteLine();
    foreach (string lst in listTest)
    {
        Console.WriteLine("3번 : " + lst);
    }

    input = new string[]  { "도망노비님의", 
                                   "블로그입니다", 
                                   "사랑해주세여^^"};

    Console.WriteLine("\nInsertRange(3, input)");
    listTest.InsertRange(3, input);

    Console.WriteLine();
    foreach (string lst in listTest)
    {
        Console.WriteLine(lst);
    }

    Console.WriteLine("\noutput = dinosaurs.GetRange(2, 3).ToArray()");
    string[] output = listTest.GetRange(2, 3).ToArray();

    Console.WriteLine();
    foreach (string lst in output)
    {
        Console.WriteLine(lst);
    }

 }

 MSDN 참고 : http://msdn.microsoft.com/

 
posted by 방랑군 2012. 1. 7. 16:57

출처 :  http://blog.naver.com/PostView.nhn?blogId=alfustnals&logNo=140142234603&categoryNo=41&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=search

컬렉션의 제너릭 전환 

 제너릭 사용으로 형식의 안정성 명료한 코드 / 수행성능의 향상으로

 제너릭 사용을 권장하고 있다고 한다.

 일반클래스

제너릭 클래스 

 ArrayList

List<T> 

 HashTable

Dictionary<T> 

 SortedList

SortedDictionary<T> 

 Stack

Stack<T> 

 Queue

Queue<T> 

 참조 : 소설 같은 C# 자북 http://www.jabook.com/

 예제_++_

 당산 KH 정보교육원 닷넷 수업떄 들은 자료 참고

 예제_2 : 소설 같은 C# 자북 http://www.jabook.com/ 

 static void Main(string[] args)
{
  SortedDictionary<int, string> mySL=new SortedDictionary<int, string>();
    mySL.Add(5, "소봉");
    mySL.Add(1, "곽정");
    mySL.Add(44,"황용");
    mySL.Add(6, "양과");
    mySL.Add(3, "단예");
    Pring<int, string>("1. SortedDictionary<K, V>의 목록", mySL);

    bool isContains = mySL.ContainsKey(2);
    Console.WriteLine("2. Key 2가 존재하는가? {0} ", isContains);

    Console.WriteLine("3. Key 5의 Value ? {0}", mySL[5]); 
}

private static void Pring<K, V>(string inf, SortedDictionary<K, V> myList)
 {
    Console.WriteLine(inf);

    foreach (KeyValuePair<K, V> kvp in myList)
    {
        Console.Write("\t{0}\t{1}\n", kvp.Key, kvp.Value);
    }

 }
}

[출처] [C#] 제너릭(Generic) - 컬렉션의 제너릭 전환 : 두번째 이야기|작성자 도망노비 
posted by 방랑군 2012. 1. 7. 16:56

출처 :  http://blog.naver.com/PostView.nhn?blogId=alfustnals&logNo=140142225754&categoryNo=41&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=search

 제너릭(Generic)이란??

 1] 타입 인수를 사용하여 일반화된 클래스나 메서드를 정의하는 기법

 2] 내부 구조나 알고리즘은 동일하게 하되, 취급하는 자료형이 다른 클래스나 메서드가

     필요할때 사용한다.

 3] 일반화된 클래스나 메서드를 정의하는 기법

 4] 코드량 감소 | 캐스팅 하지 않음으로 인한 속도 증가 효과

 제너릭 클래스

 1] 여러 자료형을 가지는 연산에서 컬렉션과 Object 처럼 여러 자료형을 같이 사용할 수

     있게 하는 방법 --> 자료형 한번 주면 따로 형변환 필요없어서 좋다..

 2] 멤버변수 타입을 미리 결정하지 않고, 클래스를 사용 할 떄 결정

 3] 클래스 이름을 여러개 기억 하지 못함.

 일반 클래스 VS 제너릭 클래스 

 using System.Collections;

 namespace genericTest
 {
    class Program
    {
        static void Main(string[] args)
        {
            classTest clsInt = new classTest(44);
            Console.Write("클래스 인트 : ");
            Console.WriteLine((int)clsInt.Value + 44);

            classTest clsbool = new classTest(false);
            Console.Write("클래스 부울 : ");
            Console.WriteLine((bool)clsbool.Value);

            classTest clsStr = new classTest("도망노비님");
            Console.Write("클래스 스트링 : ");
            Console.WriteLine(clsStr.Value.ToString());

          

            genericTest<int> generInt = new genericTest<int>(44);
            Console.Write("제네릭 인트 : ");
            Console.WriteLine(generInt.Value + 44);

            genericTest<bool> generbool = new genericTest<bool>(true);
            Console.WriteLine("제네릭 부울 : " + generbool.Value);

            genericTest<string> generStr = new genericTest<string>("노비");
            Console.WriteLine("제네릭 스트링 : " + generStr.Value);
        }
    }

    class genericTest<T>
    {
        private T value;

        public genericTest(T value)
        {
            this.value = value;
        }

        public T Value
        {
            get { return this.value; }
            set { this.value = value; }
        }
    }

    class classTest
    {
        private object value;
        public classTest(object value)
        {
            this.value = value;
        }
        public object Value
        {
            get { return this.value; }
            set { this.value = value; }
        }

     }
  }

[출처] [C#] 제너릭(Generic) - 제너릭 클래스 / 메서드 : 첫번째 이야기|작성자 도망노비 
posted by 방랑군 2012. 1. 7. 16:55

출처 :  http://blog.naver.com/PostView.nhn?blogId=alfustnals&logNo=140142225754&categoryNo=41&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=search

ictionary 인터페이스
 

 IDictionary 인터페이스는 그림을 보면 알듯이...;;; ICollection으로부터 파생됬다.

 이 인터페이스의 가장 큰 특징중 하나가 순서에 의해 가던 IList와 달리 흔히 말하는

 키(Key) 와 값(Value)로 대응시켜 데이터를 삽입하고 추출 하는 방법을 제공 한다.

 한마디로 말하면 예전에 내가 해쉬테이블로 예제를 만들어서 공부한것을 올려놧

 었는데 어떤 키를 주면 그 값을 불러올 수 있듯이 데이터에 특정 키를 연결 시켜

 데이터를 추출 한다고 보면 된다.

IDictionary 속성과 함수

 IDictionary 속성

   멤버

                            설명 

 bool IsFixedSize {get;}

 컬렉션의 크기가 정해져 잇는지 검사 

 bool IsReadOnly {get;}

 컬렉션이 읽기 전용인지 검사

 ICollection Key {get;}

 컬렉션 내의 모든 키를 나열

 ICollection Values{get;}

 컬렉션 내의 모든 값을 나열

 IDictionary 함수

              멤버

                  설명 

 void Add(object key, object value)

키/밸류를 전달해 컬렉션에 데이터를 추가

 void Clear()

컬렉션 비움

 bool Contains(object Key)

특정 키가 데이터와 연관 되어있는지 검사

 IDictionaryEnumerator GetEnumerator()

키와값을 나열한다.

 void Remove(object key)

키를 전달하여 데이터를 삭제

 그림 및 내용 데이터 참고 하였습니다.

 ==> http://www.jabook.com/

예제__)

  Hashtable ht = new Hashtable();
   ht.Add("홍길동", "a1");
  ht.Add("홍드로", "b1");
  ht.Add("양현종", null); // 밸류값은 널 가능


  List<string> aList = new List<string>();
  foreach (DictionaryEntry Dic in ht)
  {

   string aKey = (string)Dic.Key;
   string aValue = (string)Dic.Value;
   if (aValue == "a1")
   {
     aList.Add(aKey);
   }
  }