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. 13. 02:19

 iBatis는 여러 솔루션들로부터 최고의 아이디어들을 표출하여 그 시너지를 이끌어낸다.

표는 각각의 접근 방법 중에서 iBatis가 차용한 몇몇 아이디어들을 정리한 것이다.

 방법

 비슷한 이점

해결된 문제점 

 저장 프로시저

 iBatis는 SQL을 캡슐화 하고 외부로 분리하여 애플리케이션 외부에 SQL을 둔다. iBatis는 저장 프로시저와 비슷하지만 객체지향적인 API를 제공한다. iBatis는 또한 저장 프로시저를 직접 호출하는 방법도 지원한다.

 비즈니스 로직이 데이터베이스 밖에 있도록 한다. 배포하기 쉽다. 테스트하기 쉽다. 이식성이 좋다.

 인라인 SQL

 iBatis는 SQL을 원형 그대로 작성할 수 있다. 문자열 연결이나 파라미터 값 설정, 결과값 가져오기 등이 불필요하다.

 iBatis는 애플리케이션 코드내에 삽입되지 않는다. 전처리기가 불필요하다. SQL의 일부가 아닌 모든 기능을 사용할 수 있다.

 동적 SQL

 iBatis는 파라미터를 기반으로 하여 동적으로 쿼리를 구성하는 기능을 제공한다. 쿼리 구성 API는 필요 없다.

 iBatis는 애플리케이션 코드에 섞인 연결된 블록으로 SQL을 작성할 필요가 없다.

 객체/관계 매핑

 iBatis는 ORM도구의 적재 지연, 조인해서 값 가져오기, 실시간 코드 생성, 상속 등과 같은 많은 기능들을 동일하게 제공한다.

 iBatis는 어떤한 데이터 모델과 객체모델의 조합도 사용할 수 있다. 이들을 어떻게 설계 할지에 대한 제약이나 규칙 같은 것은 거의 없다.

 

 

-SQL의 외부 저장과 캡슐화

  이 두 개념이 합쳐져서 iBatis가 이룩한 많은 가치와 고급기능들을 제공해준다.

 

외부로 뺀 SQL

  사용자 인터페이스 설계, 애플리케이션 프로그래밍 그리고 데이터베이스 관리 같은 서로 다른 프로그래밍 역할에 따라 다뤄지는 사항들은 서로 분리하는 것이 좋다. 이렇게 분리하면 시스템의 특정 부분에 집중할 수 있는 잘 계층화된 설계를 얻을 수 있다. 만약 SQL을 자바 소스 코드에 집어넣으면 데이터베이스 관리자나 혹은 .NET개발자들이 동일한 데이터베이스에서 작업할 경우 불편하게 된다. 외부로 뺀 SQL을 애플리케이션 소스 코드로부터 분리하여 둘 모두를 명확하게 유지할 수 있게 한다. 그렇게 함으로써 SQL은 상대적으로 특정 언어나 플랫폼에 독립적인 상태가 된다.

 

SELECT

   PRODUCTID,

   NAME,

   DESCRIPTION,

   CATEGORY

FROM PRODUCT

WHERECATEGORY = #categoryId#

 

기존 SQL과 가장 다른 점은 파라미터 #categoryId#의 형태가 특정 언어에 종속적인 세부사항에 따라 달라지는 점이다. iBatis는 이를 더 이식성 좋고 읽기 쉽게 해준다.

 

캡슐화된 SQL

  오래된 개념 중 하나로 모듈화가 있다. 캡슐화는 코드를 응집성 있는 모듈로 조직하는 것뿐만 아니라 또한 세부적인 구현을 숨기고 호출하는 코드에게 인터페이스만을 노출시키는 모듈화의 한 형태이다.

  이러한 개념은 퍼시스턴스 계층으로도 확대 적용할 수 있다. SQL의 입력과 출력을 정의하고 애플리케이션의 다른 부분으로부터 SQL 코드를 숨겨서 SQL을 캡슐화할 수 있다. 객체지향 소프트웨어 개발자라면 인터페이스를 구현으로부터 분리하는 것과 같은 방식이라고 보면 된다. SQL 개발자라면 저장 프로시저 안에 SQL을 숨기는 것이 캡슐화라고 생각하면 된다.

  iBatis는 SQL을 캡슐화하기 위해 XML을 사용한다. XML을 선택한 까닭은 일반적으로 모든 플랫폼에 이식가능하고, 산업 전반에 걸쳐 채용되었기 때문이다.

  iBatis는 XML을 사용해서 SQL 구문의 입력과 출력을 정의한다. iBatis는 파라미터와 실행 결과를 객체의 프로퍼티로 매핑하게 한다.

 

<select id="categoryById"

   parameterClass="string" resultClass="category">

          SELEC PRODUCTID, NAME, DESCRIPTION, CATEGORY

          FROM PRODUCT

          WHERE CATEGORY = #categoryId#

</select>

 

  SQL이 XML 요소로 둘러싸여 있다. 이것이 SQL을 캡슐화한 것으로 단순한 <select>요소가 SQL 구문의 이름과 파라미터 입력 타입과 결과 출력 타입을 정의하고 있다. SQL을 외부로 빼고 캡슐화함으로써 간결함과 일관성을 모두 이루어냈다.

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


참조 : http://msdn.microsoft.com/ko-kr/library/ms228112.aspx

'PP > SPRING.NET' 카테고리의 다른 글

Spring .Net 활용 가이드  (0) 2012.01.12
DI  (0) 2012.01.10
서론.  (0) 2012.01.10