임금체불 시뮬레이션 (이미지)
'Etc' 카테고리의 다른 글
[당첨] 블루아사님은 Daum메일 100GB, Daum클라우드 100GB에 당첨되셨습니다. (0) | 2011.07.16 |
---|---|
JSON (0) | 2011.06.16 |
낮은 자존감이 모든 문제의 근원이다 (0) | 2011.05.22 |
말잘하는 50가지 비결 (0) | 2011.04.24 |
[M/V] Sunshine Girl (0) | 2011.03.31 |
[당첨] 블루아사님은 Daum메일 100GB, Daum클라우드 100GB에 당첨되셨습니다. (0) | 2011.07.16 |
---|---|
JSON (0) | 2011.06.16 |
낮은 자존감이 모든 문제의 근원이다 (0) | 2011.05.22 |
말잘하는 50가지 비결 (0) | 2011.04.24 |
[M/V] Sunshine Girl (0) | 2011.03.31 |
http://www.slideshare.net/devcatpublications/ndc2010-unity-build
출처 : http://devcatpublications.wordpress.com/2010/05/28/%EC%86%A1%EC%B0%BD%EA%B7%9C-%E2%80%9Cunity-build%EB%A1%9C-%EB%B9%8C%EB%93%9C%ED%83%80%EC%9E%84-%EB%B0%98%ED%86%A0%EB%A7%89%EB%82%B4%EA%B8%B0%E2%80%9D-nexon-developer-conference-may%C2%A02010/
[펌] C Runtime 환경의 메모리 릭 잡는 방법 ( Memory Leak ) (0) | 2011.06.08 |
---|---|
[펌] 비주얼 스튜디오 _CrtDumpMemoryLeaks() 을 이용한 메모리 누수 탐지법 (0) | 2011.06.08 |
Visual Studio 2003~2008 ATL Security Update 관련..(재배포 문제..) (1) | 2011.05.25 |
프로그램의 설계시에 알아야 할 좋은 코딩 습관 (0) | 2011.05.22 |
메모리 릭 잡기 (0) | 2011.05.09 |
아래는 해결방법을 찾아다니다 데브피아에서 발견한 글입니다.
[증상]
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
일단 설치를 보류하세요.
자동업데이트도 막으십시요.
전 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"> |
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
Microsoft Visual C++ 2008 Service Pack 1 Redistributable Package ATL Security Update
제가 겪은 일을 일단 빨리 올려봅니다.
댓글로 잘못된 부분은 알려주세요.
업데이트된 내용도 올려주심 감사.
출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=8351&ref=8351
[펌] 비주얼 스튜디오 _CrtDumpMemoryLeaks() 을 이용한 메모리 누수 탐지법 (0) | 2011.06.08 |
---|---|
송창규, “unity build로 빌드타임 반토막내기”, Nexon Developer Conference, May 2010 (0) | 2011.05.30 |
프로그램의 설계시에 알아야 할 좋은 코딩 습관 (0) | 2011.05.22 |
메모리 릭 잡기 (0) | 2011.05.09 |
디버거로 프로그램 실행 도중 변수 값 조정 방법 (0) | 2011.04.29 |
#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
[펌] stl list 순회도중 삭제하기 (0) | 2011.06.08 |
---|---|
유틸 클래스 pair (0) | 2011.04.08 |
2.1 문자열을 키로 쓰는 map, set 성능 향상시키기 (0) | 2011.02.07 |
[펌] Effective STL 읽은 후 정리~ (0) | 2011.01.05 |
항목 27 : const_iterator를 iterator로 바꾸는 데에는 distance와 advance를 사용하자. (0) | 2010.11.03 |
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 |
송창규, “unity build로 빌드타임 반토막내기”, Nexon Developer Conference, May 2010 (0) | 2011.05.30 |
---|---|
Visual Studio 2003~2008 ATL Security Update 관련..(재배포 문제..) (1) | 2011.05.25 |
메모리 릭 잡기 (0) | 2011.05.09 |
디버거로 프로그램 실행 도중 변수 값 조정 방법 (0) | 2011.04.29 |
Tortoise SVN Client 에서 아이디 비밀번호를 변경하고 싶은데요.. (0) | 2011.04.22 |
lua syntax 컬러링 해주는 애드인.
vs2008용은 아래 링크에서 다운로드.
vs2010에서는 이번에 새로 추가된 확장 관리자(Extension Manager) 방식으로 제공된다.
http://visualstudiogallery.msdn.microsoft.com/7af51f37-07ad-4d6b-9c2b-00672bb051ad/
예전에 다른 종류의 어떤 애드인을 잠깐 설치했었다가,
block comment ( --[[ ... ]] ) 의 컬러링을 제대로 지원 못해서 바로 삭제한 적이 있는데
이건 깔끔하게 잘 된다.
추천 -_-)b
출처 : http://devnote.tistory.com/176
Lua 문법 (0) | 2010.06.18 |
---|
1. 오브젝트의 에니메이션
보통 이펙트는 일정 오브젝트에 텍스쳐로 그려지는 경우가 대부분입니다.
특히 많이 쓰이는 방법 중 하나는 Plan 에 텍스쳐를 입혀 제작하는 것인데,
이 방법과 함께 많이 쓰이는 방법은 빌보드 (Billboard)라고 하는 방식으로써, 제작된 plan이 언제나 카메라 쪽을 바라보게 함으로써 이펙트를 평면처럼 보이지 않게 하는 방법입니다.
이렇게 plan에 적용한 이펙트는, 지형이나 오브젝트에 닿게 되면 잘려 보이는 현상이 일어나서 plan임을 들키기 쉽다는 단점이 있습니다.
텍스쳐 좌표의 에니메이션은 Unwrap 을 이용한 맵핑 좌표를 에니메이션 시켜서 이펙트를 에니메이션 시키는 방법입니다. 이 방법은 한 장의 텍스쳐에 여러 장의 에니메이션 시퀀스를 배열한 후 메 프레임마다 좌표를 이동시키는 방법으로, 적은 양의 프레임일 때에는 효율이 좋지만 많은 양일 때에는 불편한 단점이 있습니다.
그러나 텍스쳐가 한 장으로 충분히 구현할 수 있으므로 텍스쳐의 개수를 줄이는 장점을 가지고 있습니다.
1. 한 장의 텍스쳐에 에니메이션 시킬 이미지를 모두 배열합니다.
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 |
FMOD 사이트는
입니다. 접속하시면 다운을 받을 수 있습니다.
사운드 라이브러리 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 다운 및 오류 수정.|작성자 파란
NDC10_장용석_fmod를 이용한 사운드 프로그래밍 (0) | 2011.04.09 |
---|---|
FMOD를 이용한 사운드 프로그래밍 (0) | 2011.04.09 |
[Link] FMOD 알아가기 (0) | 2011.04.08 |
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.
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.
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:
That's why I attend to leave the old version also to be available for download.
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.
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.
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.
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:
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());
}
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:
Handled
property of event argumentsThe 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?
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.
I need to suppress some keystrokes after I have processed them.
Just set the e.Handled
property to true
in the key events you have processed. It prevents the keystrokes being processed by other applications.
Is it possible to convert your global hooks to application hooks which capture keystrokes and mouse movements only within the application?
Yes. Just use...
private const int WH_MOUSE = 7;
private const int WH_KEYBOARD = 2;
... everywhere, instead of:
private const int WH_MOUSE_LL = 14;
private const int WH_KEYBOARD_LL = 13;
Does it work on Win98 (Windows ME, Windows 95)?
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.
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.
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.
How do I catch key combinations like Ctrl+Shift+A?
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.
Does it works with .NET Framework 1.1 and Visual Studio 2003?
Yes. The file UserActivityHook.cs can be used without any changes, in a Visual Studio 2003 .NET 1.1 project.
This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)
George Mamaladze Software Developer (Senior) Germany Member |
[펌] 입력 문자 검사 (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 |