블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2794)
Unity3D (852)
Programming (478)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (11)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
반응형
Posted by blueasa
, |
반응형
Posted by blueasa
, |

아래는 해결방법을 찾아다니다 데브피아에서 발견한 글입니다.

[증상]
OS : Win7 x64
프로그램 : VS2008 x86으로 제작

프로그램을 만들어서 배포를 했는데 팀원(Win7 x64)의 컴퓨터에서 side-by-side 에러 어쩌고 하면서 실행이 안됐습니다.

그래서 열심히 검색하다가 데브피아에서 아래와 같은 글을 발견했는데..

아래 글을 보고 생각하다보니 Win7 x64에서 자동업데이트를 해봤자 재배포 패키지가 x64만 깔린다는 생각이 들어서

Microsoft Visual C++ 2008 서비스 팩 1 재배포 가능 패키지 ATL 보안 업데이트 x86 버전을 받아서 직접 깔았더니 잘 실행 되네요.

아래 글이 도움 많이 됐습니다. =ㅅ=

Microsoft Visual C++ 2005 서비스 팩 1 재배포 가능 패키지 ATL 보안 업데이트
http://www.microsoft.com/downloads/ko-kr/details.aspx?FamilyID=766A6AF7-EC73-40FF-B072-9112BAB119C2

Microsoft Visual C++ 2008 재배포 가능 패키지 ATL 보안 업데이트
http://www.microsoft.com/downloads/ko-kr/details.aspx?familyid=8B29655E-9DA4-4B6B-9AC5-687CA0770F93&displaylang=ko

Microsoft Visual C++ 2008 서비스 팩 1 재배포 가능 패키지 ATL 보안 업데이트
http://www.microsoft.com/downloads/ko-kr/details.aspx?familyid=2051A0C1-C9B5-4B0A-A8F5-770A549FD78C&displaylang=ko





VC 2005,2008 ATL관련 보안업데트가 있습니다.

일단 설치를 보류하세요.

자동업데이트도 막으십시요.

 

 

전 2008을 사용중인데. 어제 VC관련 업데이트가 떴길래 무심코 업데이트를 했습니다.

그리고 오늘 수정건을 업체에 배포했는데 죽어도 실행이 안되길래

따로 테스트를 해보았습니다.

 

결론부터 말씀드리면 업데이트3건은

2005, 2008 재배포 패키지(sp1일경우는 따로..) 관련

vs 2008관련

3가지가 설치되는데요.

 

이게 배포시 기본 2008하고 sp1이 다르듯이 아예 재배포 패키지가 다릅니다.

즉 dll버젼이 다르죠.

 

2008 기본 버젼이 9.0.21022.8이고

sp1이 9.0.30729.1

이번 업데이트로 (sp1) 9.0.30729.4148

 

dll버젼이 달라서 재배포 패키지를 최신버젼으로 다시 설치해야됩니다.

 

여기서 젤큰 문제 세가지는

1. 2005,2008 재배포 관련 설치는 추가/제거에 존재하는데 삭제해도 똑같다.

-> vs 2008 sp1관련 업데이트 삭제가 없다.

 

2. 윈도우 복원을 했는데요. 똑같이 문제가 발생하더란 겁니다.

-> 설치된 목록에도 없고 업데이트 해달라고 떡하니 뜨는데도 말이죠;

 

3. 2005부터 재배포 패키지로 바뀌었지만 설치된 폴더에서 필요한 몇개의 파일만 같이 포함하면

문제없었는데 이번엔 아예 그게 안먹힙니다. 제결론으로 그 이유는

 

manifest 명시를 보면

 

기존 sp1을 보면(mfc사용시)

 

 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.1" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.MFC" version="9.0.30729.1" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>

 

9.0.30729.1 버젼의 crt와 mfc라이브러만 명시되어 있지만

 

이번 업데이트로는

  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.4148" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.MFC" version="9.0.30729.4148" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.1" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>

 

9.0.30729.1과 9.0.30729.4148 CRT를 둘다 필요로 합니다. 고로 9.0.30729.4148 dll만 포함하면 실행이 안되겠죠.

 

결론.

아직 정확한 문서를 못봐서 atl관련 뭐가 업데이트 됐는진 모르지만 설치하지마세요 ㅡ.ㅡ;

이미 설치하셨다면 업데이트된 pc에서 컴파일한 파일 배포시는 재배포 패키지를 바꿔야합니다.

아예 모든 재배포 패키지를 최신꺼로 바꿔야합니다;

 

 

sp1용 재배포 패키지 주소 올려드립니다. 한글로는 아직검색 안되는듯 하네요.

Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package ATL Security Update

http://www.microsoft.com/downloads/details.aspx?familyid=766A6AF7-EC73-40FF-B072-9112BAB119C2&displaylang=en

 

Microsoft Visual C++ 2008 Service Pack 1 Redistributable Package ATL Security Update

http://www.microsoft.com/downloads/details.aspx?familyid=2051A0C1-C9B5-4B0A-A8F5-770A549FD78C&displaylang=en

 

 

제가 겪은 일을 일단 빨리 올려봅니다.

댓글로 잘못된 부분은 알려주세요.

업데이트된 내용도 올려주심 감사.


출처 :  http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=8351&ref=8351

반응형
Posted by blueasa
, |

#include <iostream>
#include <list>
using namespace std;

 

template<typename T> 
class Stack
{
public:
 Stack() : m_bLIFO(true) { Clear(); }

 // 저장 방식을 설정한다.
 void SetLIFO( bool bLIFO ) { m_bLIFO = bLIFO; }

 // 초기화 한다.
 void Clear()
 {
  if( false == m_Datas.empty() )
   m_Datas.clear();
 }

 // 스택에 저장된 개수
 int Count() { return static_cast( m_Datas.size() ); }

 // 저장된 데이터가 없는가?
 bool IsEmpty() { return m_Datas.empty(); }


 // 데이터를 저장한다.
 void push( T data )
 {
  m_Datas.push_back( data ); 
 }

 // 스택에서 빼낸다.
 bool pop( T* data )
 {
  if( IsEmpty() )
  {
   return false;
  }


  if( m_bLIFO )
  {
   memcpy( data, &m_Datas.back(), sizeof(T) );
   m_Datas.pop_back();
  }
  else
  {
   memcpy( data, &m_Datas.front(), sizeof(T) );
   m_Datas.pop_front();
  }

  return true;
 }

private:
 list<T> m_Datas;
 bool  m_bLIFO; // true 이면 후입선출, false 이면 선입선출
};

 

void main()
{

 Stack<int> Int_Stack;

 Int_Stack.SetLIFO(true);

 Int_Stack.push(10);
 Int_Stack.push(20);
 Int_Stack.push(30);

 int Value = 0;
 Int_Stack.pop(&Value);
 //마지막에 넣은게 처음 나온다.
 cout << "Last In First Out pop : " << Value << endl <<  endl;
 
 //데이터 초기화
 Int_Stack.Clear();

 //FIFP로 설정
 Int_Stack.SetLIFO(false);

 Int_Stack.push(10);
 Int_Stack.push(20);
 Int_Stack.push(30);

 Int_Stack.pop(&Value);
 //처음에 넣은게 처음 나온다.
 cout << "First In First Out pop : " << Value << endl <<  endl;

}

 출처 : http://cafe.naver.com/jgcafe/694

반응형
Posted by blueasa
, |
반응형

'Etc' 카테고리의 다른 글

JSON  (0) 2011.06.16
임금체불 시뮬레이션 (이미지)  (0) 2011.05.31
말잘하는 50가지 비결  (0) 2011.04.24
[M/V] Sunshine Girl  (0) 2011.03.31
저렴한 거북목 피는 스트레칭  (0) 2011.02.12
Posted by blueasa
, |
반응형
Posted by blueasa
, |

lua syntax 컬러링 해주는 애드인. 

vs2008용은 아래 링크에서 다운로드.

http://vslua.codeplex.com/

vs2010에서는 이번에 새로 추가된 확장 관리자(Extension Manager) 방식으로 제공된다.

http://visualstudiogallery.msdn.microsoft.com/7af51f37-07ad-4d6b-9c2b-00672bb051ad/

예전에 다른 종류의 어떤 애드인을 잠깐 설치했었다가, 
block comment ( --[[ ... ]] ) 의 컬러링을 제대로 지원 못해서 바로 삭제한 적이 있는데 
이건 깔끔하게 잘 된다. 

추천 -_-)b


출처 : http://devnote.tistory.com/176

 

반응형

'Programming > Lua' 카테고리의 다른 글

Lua 문법  (0) 2010.06.18
Posted by blueasa
, |
이펙트를 에니메이션 시키는 방법은 약 4가지 정도가 일반적으로 사용됩니다
이 방법은 각자 장단점이 있기 때문에필요에 따라 적절한 방식을 선택하여 사용하며때로는 각 방법은 혼합해서 사용하는 경우가 많습니다

1. 오브젝트의 에니메이션


보통 이펙트는 일정 오브젝트에 텍스쳐로 그려지는 경우가 대부분입니다
특히 많이 쓰이는 방법 중 하나는 Plan 에 텍스쳐를 입혀 제작하는 것인데

이 방법과 함께 많이 쓰이는 방법은 빌보드 (Billboard)라고 하는 방식으로써제작된 plan이 언제나 카메라 쪽을 바라보게 함으로써 이펙트를 평면처럼 보이지 않게 하는 방법입니다

이렇게 plan에 적용한 이펙트는지형이나 오브젝트에 닿게 되면 잘려 보이는 현상이 일어나서 plan임을 들키기 쉽다는 단점이 있습니다.



그리고 이렇게 오브젝트에 적용된 이펙트는오브젝트를 회전시키거나 크기를 에니메이션 시켜서 이펙트를 에니메이션 시킬 수 있습니다
이 방식은 단순히 회전이나 크기이동를 에니메이션 시킬 수 밖에 없다는 단점을 가지고 있습니다이펙트의 모양을 변하게 하기 위해서는 다른 방법을 사용해야 합니다



2. 텍스쳐 좌표 에니메이션

텍스쳐 좌표의 에니메이션은 Unwrap 을 이용한 맵핑 좌표를 에니메이션 시켜서 이펙트를 에니메이션 시키는 방법입니다이 방법은 한 장의 텍스쳐에 여러 장의 에니메이션 시퀀스를 배열한 후 메 프레임마다 좌표를 이동시키는 방법으로적은 양의 프레임일 때에는 효율이 좋지만 많은 양일 때에는 불편한 단점이 있습니다
그러나 텍스쳐가 한 장으로 충분히 구현할 수 있으므로 텍스쳐의 개수를 줄이는 장점을 가지고 있습니다


1. 한 장의 텍스쳐에 에니메이션 시킬 이미지를 모두 배열합니다


2. Plan
에 이 텍스쳐를 적용시킵니다연속적으로 배열된 이미지가 한 장에 모두 배열됩니다.

3. Unwrap UVW
텍스쳐의 일부분만을 영역 지정해 준 후에니메이션 버튼을 이용하여 메 프레임 좌표를 이동시킵니다



3. Ifl 파일을 이용한 에니메이션

ifl 파일을 이용한 에니메이션은 텍스쳐 좌표 에니메이션처럼 각 에니메이션 시퀀스 이미지를 에니메이션 시킨다는 것은 동일하지만그 각각의 이미지가 파일로 독립되어 있고, ifl 이라고 불리는 파일 포멧으로 그 에니메이션을 제어한다는 것이 다른 점입니다
파일 개수가 많아진다는 단점이 존재하지만사용하기에는 상대적으로 간단한 방법입니다

1. 
에니메이션 텍스쳐를 준비합니다각각 다른 파일로 준비합니다.

2. 
에니메이션 이펙트 텍스쳐가 있는 폴더에 txt 파일을 하나 만들어 넣고다음과 같이 각 에니메이션 프레임의 파일명을 작성합니다뒤에 있는 숫자는 각 파일별 프레임 속도입니다숫자가 클수록 느리게 됩니다


3. 
파일 확장자를 ifl로 바꾼 다음텍스쳐와 동일한 폴더에 저장한 후이 파일을 이용해서 텍스쳐링하면 에니메이션 됩니다


4. 파티클을 이용한 에니메이션

파티클은 3D max 에 기본적으로 포함되어 있는 파티클 시스템을 의미합니다
많은 게임 엔진에서 3dmax의 파티클 시스템을 그대로 게임 엔진으로 컨버팅 하는 기능을 가지고 있지만일부 엔진에서는 이 기능을 지원하지 않고따로 자체 툴을 제작하여 제공하는 경우도 있습니다


만약 엔진이 3D max의 파티클 시스템을 지원한다면, 3D max의 파티클 시스템을 이용하여 이펙트를 제작하기만 하면 게임 엔진에도 그대로 들어갑니다
일반적으로 파티클을 이용한 이펙트는 퀄리티가 좋지만부하가 많이 걸리는 작업입니다




5. 쉐이더를 이용한 에니메이션 방법 (추가)

http://chulin28ho.egloos.com/4784689


출처 : 
http://chulin28ho.egloos.com/4652773 
반응형

'Gamebryo > Effect' 카테고리의 다른 글

Effect 애니메이션 초기화 방법  (0) 2011.09.21
[펌] 체인라이트닝 이펙트 만들기  (1) 2011.06.11
강의자료 - 파티클 예제  (0) 2011.03.22
Setup about Effect Dumy…  (0) 2011.03.21
파티클 컨트롤 해보기  (0) 2011.02.24
Posted by blueasa
, |

FMOD 사이트는

 

http://www.fmod.org/

 

입니다. 접속하시면 다운을 받을 수 있습니다.

 

사운드 라이브러리 FOMD_API 입니다. Direct_Sound가 쓰기엔 불편한 점이 있습니다. 일단 FMOD를 직접 사용해 보시면 꽤나 편하다는 것을 느끼실 수 있을겁니다. FMOD를 설치를 하면 추가 해야 할 사항이 3가지가 있습니다.

 

1. 디렉터리 추가

상단 메뉴에서 프로젝트 -> 클릭 하시면 제일 아래 메뉴 Projectname속성 클릭 -> 속성 창이 뜹니다. 그러면 메뉴중에

c/c++ -> 일반 -> 추가 포함 디렉터리 -> 경로를 지정해주면 되는데 확장자가 inc를 지정해주셔야 합니다. 
저의 경로는 "C:\Program Files\FMOD SoundSystem\FMOD Programmers API Win32\api\inc" 입니다.""를 잊지 맙시다.

2. 라이브러리 추가.

마찬가지로 상단메뉴 프로젝트 -> ProjcetName속성 클릭 -> 속성 창이 뜹니다. 그러면 메뉴중에 링커 클릭-> 일반 ->
오른쪽 메뉴 중에서 추가 라이브러리 디렉터리 경로를 적으시면 됩니다. 저의 경로는 
"C:\Program Files\FMOD SoundSystem\FMOD Programmers API Win32\api\lib" 입니다. 이번 건 확장자  lib입니다.

3. FMOD 설치 하시면 설치 폴더 안에 api폴더가 있는데 api폴더 안으로 들어가셔서 fmodex.dll 복사.


그 다음에 진행중인 프로젝트 폴더 안에 fmodex.dll 붙여넣기 하시고 실행 시켰을 때 창이 뜨면서fmodex.dll 파일을 찾을 수 없다고 메시지가 뜨면 디버그 안에다가 복사를 한번 해주세요. 아마 이러면 잘 돌아갈 겁니다.

자 이렇게 세 가지 사항을 추가를 하시고 본격적으로 진행중인 프로젝트에 사운드를 틀어봅시다.

 

우선 코드에 기본적으로 선언해야 할 해더파일이 있습니다.

 

#include <fmod.hpp>
#include <fmod_errors.h>
#pragma  comment( lib, "fmodex_vc.lib" )

 

위 해더파일들을 기본적으로 선언해 주시고요.

 

 FMOD::System   * System;

 FMOD::Sound*     SoundName;
 FMOD::Channel*  channel;

 

윗 세 줄이 기본적으로 사운드를 틀기 위해 선언한 타입별 변수입니다. 

 

::를 봐서 아시겠지만 FMOD안에 포함이 된 System, Sound, Channel 들 입니다.

 

FMOD::System

System은 음악을 틀기 위한 기기라고 생각하시면 됩니다.

 

FMOD::Sound

 효과음의 갯수만큼 선언해주시면 됩니다. 폭발음, 탄을 쏠 때이 효과음이라던가 그 효과음의 갯수만큼 선언을 해 주시면 됩니다.

FMOD::Channel

채널을 컨트롤 하여 사운드의 볼륨을 설정해 줄 수 있습니다.

 

자 그럼 본격적으로 소스 한번 적어볼게요.

먼저 사운드를 생성하는 겁니다.

저의 경우

LOADSoundAll() 이라는 함수에서 사운드를 생성합니다.

함수안의 내용은

 

LOADSoundAll()

{

FMOD_RESULT result;

 result = FMOD::System_Create( &System );
 ERRCHECK( result );

 result= System->init( 100, FMOD_INIT_NORMAL, 0 );
 ERRCHECK( result );

 result = System->createSound( "../data/sound/stage1.wav", FMOD_DEFAULT, 0, &initSound );
 ERRCHECK( result );
 
 result = System->createSound("../data/sound/stage1.wav", FMOD_DEFAULT, 0, &Stage_1_Sound );
 ERRCHECK( result );
 
 result = System->createSound("../data/sound/Type1.wav", FMOD_DEFAULT, 0, &fireSound );
 ERRCHECK( result );

 result = System->createSound("../data/sound/Type2.wav", FMOD_DEFAULT, 0, &laserSound );
 ERRCHECK( result );
 
 result = System->createSound( "../data/sound/Destroy.wav", FMOD_DEFAULT, 0, &DestroySound );
 ERRCHECK( result );

 result = System->createSound("../data/sound/Stage2.wav", FMOD_DEFAULT, 0, &explosionSound );
 ERRCHECK( result );

}

이렇게 사운드를 생성합니다.

 

중요한 부분은 함수 안의 변수 선언부.

 

FMOD_RESULT result;

result = FMOD::System_Create( &System );

 

이렇게 해야지만 사운드를 생성할 수 있습니다.

한마디로 사운드를 생성하는 변수 타입이 FMOD_RESULT 라는 녀석이죠.

 

함수안의 윗 두줄 밑으로는 이해하기가 편합니다.

createSound안에 경로 적어주시면 되고 createSound의 3번째 인자는 FMOD::Sound의 변수명입니다. 효과음 이름이죠. 반드시 주소값( & )과 함께 써야합니다.

 

그리고 사운드 파일이 없다거나 잘못된 사운드 파일일 경우에 에러체크를 해줘야 합니다.

 

ERRCHECK( result )가 있는데

 

이녀석은 제가 따로 만든 함수입니다.

 

함수를 보면

 

ERRCHECH( FMOD_RESULT result )

{

  if( result != FMOD_OK )

{

  char str 256;

  sprintf( str, "FMOD error! (%d) %s\n", reuslt, FMOD_ErrorSting( result ) );

  MessageBox( NULL, str, "TEST", MB_OK );

}

}

이렇게 에러를 체크합니다. 에러체크는 안해줘도 별 상관은 없지만, 사운드 파일이 없다거나 그럴 때 메시지를 띄워주는게  좋은 습관이 아닌가 생각을 합니다.

 

저 함수안에서는 문자열 str 의 크기를 반드시 256으로 선언해줘야 합니다. 안 그러면 에러가 납니다.

 

다음으로 사운드를 재생시켜야 합니다.

전 PlaySound()라는 함수에서 재생을 합니다.

 

소스를 살펴보면

PlaySounc( char* sound_name )

{

 FMOD_RESULT result;

if ( sound_name == "stage_1" )
 {
  initSound->release();
  result = System->playSound( FMOD_CHANNEL_FREE, Stage_1_Sound, FALSE,  &channel );
  channel->setVolume( 1.f );
  ERRCHECK( result );
 }
 
 else if ( sound_name == "normal_bullet" )
 {
  result = System->playSound( FMOD_CHANNEL_FREE, fireSound, FALSE,  &channel );
  channel->setVolume( 0.5f );
  ERRCHECK( result );
 }
 
 else if ( sound_name == "user_laser" )
 {
  result = System->playSound( FMOD_CHANNEL_FREE, laserSound, FALSE,  &channel );
  channel->setVolume( 0.5f );
  ERRCHECK( result );
 }
  
 else if ( sound_name == "destroy" )
 {
  result = System->playSound( FMOD_CHANNEL_FREE, DestroySound, FALSE,  &channel );
  channel->setVolume( 0.25f );
  ERRCHECK( result );
 }

 else if ( sound_name == "explosion_sound" )
 {
  result = System->playSound( FMOD_CHANNEL_FREE, explosionSound, FALSE,  &channel );
  channel->setVolume( 1.f );
  ERRCHECK( result );
 }

}

이렇게 사운드를 재생해주는 함수에서 재생을 해 줍니다.

 

위 코드를 보면 chnnel->setVolume( 1.f );

이렇게 되어있습니다. 괄호안의 수치는 0.1f부터 1.0까지 수치를 주면 됩니다.

당연한 말이지만 수치가 크면 클수록 사운드의 크기도 커집니다. 프로젝트 안의 옵션중에 사운드 크기를 조절하는 기능을 추가할려면 저 안의 수치에 변수를 두면 좋겠죠^^.

 

에레체크는 항상 해 줍시다. 항상입니다. 항상~~~


[출처]
 FMODEX (SOUND_LIBRARY) FMOD DLL 다운 및 오류 수정.|작성자 파란

반응형
Posted by blueasa
, |

Introduction

This class allows you to tap keyboard and mouse and/or to detect their activity even when an application runs in the background or does not have any user interface at all. This class raises common .NET events withKeyEventArgs and MouseEventArgs, so you can easily retrieve any information you need.

Background

There are a number of applications that run in the background and detect user inactivity to change their mode. For example, MSN Messenger (or any other messenger). I was going to write such an application, so I searched MSDN and found "exactly" what I needed: 318804 - HOW TO: Set a Windows Hook in Visual C# .NET. This article describes how to tap the mouse movement, but it works only when an application is active. At the end of this article, I found this explanation: "Global hook is not supported in .NET Framework. You cannot implement global hooks in Microsoft .NET Framework...". Anyway, I continued my research and found out that there are exceptions. There are WH_KEYBOARD_LL and WH_MOUSE_LL hooks that can be installed globally. So, I have basically replaced WH_MOUSE with WH_MOUSE_LL in the MSDN example, and it works.

The second step was to extract the information received into a .NET EventArgs and raise the appropriate events.

I found a similar article in CodeProject, under Global System Hooks in .NET by Michael Kennedy, but what I dislike is, there is an unmanaged DLL in C++ that is a main part of this solution. This unmanaged DLL is in C++, and a number of classes make it complicated to integrate it in my own tiny application.

Revisions

This article was posted in 2004 and updated in 2006. During all this time until now I receive a lot of positive feedback and recommendations. There were also a number of technology improvements like .NET Framework 3.5 or Visual Studio 2008. So I have decided to update it once more.

I have refactored and improved the solution, made it more flexible, stable and efficient. But this refactoring also had some drawbacks:

  1. Number of code lines and files has grown.
  2. Backward compatibility to older .NETs is lost.

That's why I attend to leave the old version also to be available for download.

Using the Code [Version 2]

The Simple Way

If you are developing a Windows Forms application and prefer drag & drop programming, there is a componentnamed GlobalEventProvider inside the assembly Gma.UserActivityMonitor.dll. Just drag and drop it to your form and create events using the property editor events tab.

The Alternative Way

Use events provided by the static class HookManager. Note that the sender object in events is alwaysnull.

For more usage hints, see the source code of the attached demo application.

Using the Code [Version 1]

To use this class in your application, you need to just create an instance of it and hang on events you would like to process. Hooks are automatically installed when the object is created, but you can stop and start listening using appropriate public methods.

 Collapse
UserActivityHook actHook;
void MainFormLoad(object sender, System.EventArgs e)
{
    actHook= new UserActivityHook(); // crate an instance

    // hang on events

    actHook.OnMouseActivity+=new MouseEventHandler(MouseMoved);
    actHook.KeyDown+=new KeyEventHandler(MyKeyDown);
    actHook.KeyPress+=new KeyPressEventHandler(MyKeyPress);
    actHook.KeyUp+=new KeyEventHandler(MyKeyUp);
}

Now, an example of how to process an event:

 Collapse
public void MouseMoved(object sender, MouseEventArgs e)
{
    labelMousePosition.Text=String.Format("x={0}  y={1}", e.X, e.Y);
    if (e.Clicks>0) LogWrite("MouseButton     - " + e.Button.ToString());
}

Changes and Updates from [Version 0] to [Version 1]

I'd like to thank you all for all the useful comments in the discussion forum. There were a lot of bugs and proposals posted after this article was published on 4th June, 2004. Over and over again came the same topics, and I had to refer to previous posts in the discussion, that is why I have decided to revise the code and publish a FAQ. Here is the list of the most important changes:

  • The project was converted into Visual Studio 2005
  • The problem with upper case characters is solved
  • Mouse wheel information is now included in event arguments
  • Better exception handling
  • Cancellation of keyboard events using the Handled property of event arguments
  • XML documentation of functions

FAQ [Version 1]

Question

The project cannot be run in Visual Studio .NET 2005 in debug mode because of an exception error caused by calling the SetWindowsHookEx. Why? Is it a problem of .NET 2.0?

Answer

The compiled release version works well so that cannot be a .NET 2.0 problem. To workaround, you just need to uncheck the check box in the project properties that says: "Enable Visual Studio hosting process". In the menu: Project -> Project Properties... -> Debug -> Enable the Visual Studio hosting process.

Question

I need to suppress some keystrokes after I have processed them.

Answer

Just set the e.Handled property to true in the key events you have processed. It prevents the keystrokes being processed by other applications.

Question:

Is it possible to convert your global hooks to application hooks which capture keystrokes and mouse movements only within the application?

Answer

Yes. Just use...

 Collapse
private const int WH_MOUSE = 7;
private const int WH_KEYBOARD = 2;

... everywhere, instead of:

 Collapse
private const int WH_MOUSE_LL = 14;
private const int WH_KEYBOARD_LL = 13;

Question

Does it work on Win98 (Windows ME, Windows 95)?

Answer

Yes and No. The global hooks WH_MOUSE_LL and WH_KEYBOARD_LL can be monitored only under Windows NT/2000/XP. In other cases, you can only use application hooks (WH_MOUSE and WH_KEYBOARD) which capture keystrokes and mouse movement only within the application.

Question

I have a long delay when closing applications using hooks by clicking the x button in the titlebar. If I close the application via another event (button click) for example, that works fine.

Answer

It's a known bug of Microsoft. It has to do with the Windows themes. If you disable the Windows themes, the problem goes away. Another choice is to have the hook code run in a secondary thread.

Question

How do I catch key combinations like Ctrl+Shift+A?

Answer

You'll have to track which keys have gone down but not up. Only the most recently pressed key keeps sendingKeyDown messages, but the others will still send a KeyUp when released. So if you make three flagsIsCtrlDown, IsShiftDown, and IsADown, and set them to true at KeyDown and false at KeyUp, the expression (IsCtrlDown && IsShiftDown && IsADown) will give you the required result.

Question

Does it works with .NET Framework 1.1 and Visual Studio 2003?

Answer

Yes. The file UserActivityHook.cs can be used without any changes, in a Visual Studio 2003 .NET 1.1 project.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

George Mamaladze

Software Developer (Senior)

Germany Germany

Member


출처 : http://www.codeproject.com/KB/cs/globalhook.aspx
반응형

'Programming > C#' 카테고리의 다른 글

[펌] 입력 문자 검사  (0) 2011.09.14
C# 관련 정보 사이트[MKEXDEV.NET]  (0) 2011.09.13
Array -> String  (0) 2011.05.09
SaveFileDialog  (0) 2011.03.25
DataGridView to XML  (0) 2011.03.23
Posted by blueasa
, |