블로그 이미지
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

이펙트 출력

Gamebryo/Effect / 2011. 2. 8. 17:03

이펙트 애니메이션이 종료되는 시점(이펙트 애니메이션 시간)을 알아야한다.
아래 함수는 이펙트 애니메이션 길이(시간)을 알아내는 함수이다.

//////////////////////////////////////////////////////////////////////////////
<이펙트 출력 순서>
1. 이펙트를 로딩한다.
2. 아래 함수를 통해 애니메이션 길이(m_fAnimLength)을 구한다.
3. 이펙트 애니메이션 시작 시간을 정한다.
    NiTimeController::StartAnimations( m_spEffect, m_fStartTime );
4. 이펙트 종료를 체크한다.
    if( fTime - m_fStartTime >= m_fAnimLength )
        m_spEffect = 0;   // 이펙트 노드 제거
    else
        m_spEffect->Update( fTime );
//////////////////////////////////////////////////////////////////////////////

void RecursiveGetAnimRange(NiAVObject* pkObject, float& rfLoKeyTime, float& rfHiKeyTime)
{
    NiTimeController* pkController = pkObject->GetControllers();
    while ( pkController )
    {
        float fLoTime = pkController->GetBeginKeyTime();
        float fHiTime = pkController->GetEndKeyTime();
        if ( fLoTime < rfLoKeyTime )
            rfLoKeyTime = fLoTime;
        if ( fHiTime > rfHiKeyTime )
            rfHiKeyTime = fHiTime;

        pkController->SetAnimType( NiTimeController::APP_INIT );
        pkController = pkController->GetNext();
    }

    // Do the same for any animation controllers attached to the rendering properties
    if ( NiIsKindOf( NiAVObject, pkObject ) )
    {
        NiAVObject* pAVObj = (NiAVObject*)pkObject;
        pAVObj->SetSelectiveUpdate(true);
        pAVObj->SetSelectiveUpdateTransforms(true);
        pAVObj->SetSelectiveUpdatePropertyControllers(true);
        pAVObj->SetSelectiveUpdateRigid(false);

        NiTListIterator kPos = pAVObj->GetPropertyList().GetHeadPos();
        while ( kPos )
        {
            NiProperty *pProp = pAVObj->GetPropertyList().GetNext( kPos );
            if ( pProp )
            {
                for ( pkController = pProp->GetControllers(); pkController; pkController = pkController->GetNext() )
                {
                    float fLoTime = pkController->GetBeginKeyTime();
                    float fHiTime = pkController->GetEndKeyTime();
                    if ( fLoTime < rfLoKeyTime )
                        rfLoKeyTime = fLoTime;
                    if ( fHiTime > rfHiKeyTime )
                        rfHiKeyTime = fHiTime;

                    pkController->SetAnimType( NiTimeController::APP_INIT );
                }
            }
        }

    }

    if ( NiIsKindOf( NiNode, pkObject ) )
    {
        NiNode* pkNode = (NiNode*)pkObject;
        for ( unsigned int i = 0; i < pkNode->GetArrayCount(); ++i )
        {
            NiAVObject* pkChild = pkNode->GetAt( i );
            if ( pkChild )
                RecursiveGetAnimRange( pkChild, rfLoKeyTime, rfHiKeyTime );
        }
    }
}


------------------------------------------------------------------
ex)
    float fLoTime =  NI_INFINITY;
    float fHiTime = -NI_INFINITY;
    RecursiveGetAnimRange( m_spModel, fLoTime, fHiTime );
    m_fAnimLength = fHiTime - fLoTime;    // 애니메이션 전체 시간 계산

[출처] GameBryo - 이펙트 출력|작성자 모냐

반응형

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

강의자료 - 파티클 예제  (0) 2011.03.22
Setup about Effect Dumy…  (0) 2011.03.21
파티클 컨트롤 해보기  (0) 2011.02.24
이펙트 작업에 필요한 기능  (0) 2011.01.27
검광, 검기 잔상 효과에 대하여...  (1) 2011.01.21
Posted by blueasa
, |
    문자열(std::string)을 키로 가지는 맵 같은 경우, 문자열 비교 자체에 걸리는 시간 때문에 검색이 느려질 수 있다. 이 경우, 키로 사용하는 문자열이 별로 중요한 내용이 아니라면 아래와 같은 클래스를 사용함으로서 성능을 약간 증가시킬 수 있다. 
    ////////////////////////////////////////////////////////////////////////////////
    /// \class cStringKey
    /// \brief STL 컨테이너를 위한 문자열 키
    ////////////////////////////////////////////////////////////////////////////////
    
    class cStringKey
    {
    private:
        enum
        {
            BYTE_SIZE = 32,
        };
    
        char m_Text[BYTE_SIZE]; ///< 문자열
    
    
    public:
        /// \brief 생성자
        cStringKey()
        {
            memset(m_Text, 0, sizeof(m_Text));
        }
    
        /// \brief 생성자
        cStringKey(const char* text)
        {
            memset(m_Text, 0, sizeof(m_Text));
            memcpy_s(m_Text, sizeof(m_Text), text, std::min(sizeof(m_Text), strlen(text)));
        }
    
        /// \brief 생성자
        cStringKey(const std::string& text)
        {
            memset(m_Text, 0, sizeof(m_Text));
            memcpy_s(m_Text, sizeof(m_Text), text.c_str(), std::min(sizeof(m_Text), text.size()));
        }
    
        /// \brief 복사 생성자
        cStringKey(const cStringKey& rhs)
        {
            memcpy_s(m_Text, sizeof(m_Text), rhs.m_Text, sizeof(m_Text));
        }
    
    
    public:
        /// \brief 대입 연산자
        inline const cStringKey& operator = (const cStringKey& rhs)
        {
            if (this != &rhs)
                memcpy_s(m_Text, sizeof(m_Text), rhs.m_Text, sizeof(m_Text));
    
            return *this;
        }
    
        /// \brief 비교 연산자
        ///
        /// 이 함수는 약간 유의해야 하는데, 속도를 위해 루프를 풀어버렸기 때문이다.
        /// 클래스의 크기가 변경되면, 이 함수도 같이 변경해줘야 한다.
        inline bool operator < (const cStringKey& rhs) const
        {
            const int* buf1 = reinterpret_cast<const int*>(this);
            const int* buf2 = reinterpret_cast<const int*>(&rhs);
    
            if (*buf1 != *buf2) return *buf1 < *buf2; // 0-3
    
            ++buf1; ++buf2;
            if (*buf1 != *buf2) return *buf1 < *buf2; // 4-7
    
            ++buf1; ++buf2;
            if (*buf1 != *buf2) return *buf1 < *buf2; // 8-11
    
            ++buf1; ++buf2;
            if (*buf1 != *buf2) return *buf1 < *buf2; // 12-15
    
            ++buf1; ++buf2;
            if (*buf1 != *buf2) return *buf1 < *buf2; // 16-19
    
            ++buf1; ++buf2;
            if (*buf1 != *buf2) return *buf1 < *buf2; // 20-23
    
            ++buf1; ++buf2;
            if (*buf1 != *buf2) return *buf1 < *buf2; // 24-27
    
            ++buf1; ++buf2;
            return *buf1 < *buf2; // 28-31
        }
    };

    대소문자 구별없이 비교를 할 수 없다는 점이 좀 아쉽다. 어셈블리도 좀 안다면 비교 연산자를 좀 더 깔끔하게 만들 수 있을 텐데. 어쨌든 테스트해보니, 릴리즈 빌드에서 약 25~33% 정도의 성능이 향상되었다. 
    typedef std::map<std::string, std::string> OLD_MAP;
    typedef std::map<cStringKey, std::string> NEW_MAP;
    
    OLD_MAP oldMap;
    NEW_MAP newMap;
    
    for (int i=0; i<1000; ++i)
    {
        std::string key = generic::to_string(rand() % 1000, 4);
        std::string value = generic::to_string(rand() % 1000, 4);
        oldMap.insert(OLD_MAP::value_type(key, value));
        newMap.insert(NEW_MAP::value_type(key, value));
    }
    
    DWORD begin = 0, oldTime = 0, newTime = 0;
    int repetition = 200000;
    
    begin = timeGetTime();
    for (int i=0; i<repetition; ++i)
    {
        oldMap.find(generic::to_string(rand() % 1000, 4));
    }
    oldTime = timeGetTime() - begin;
    
    begin = timeGetTime();
    for (int i=0; i<repetition; ++i)
    {
        newMap.find(generic::to_string(rand() % 1000, 4));
    }
    newTime = timeGetTime() - begin;
    
    std::cout << "OLD: " << oldTime << std::endl;
    std::cout << "NEW: " << newTime << std::endl;


반응형
Posted by blueasa
, |

define DEBUG_OUTPUT
//------------------------------------------------------------------------
// 2010/01/22 [19:56:32]
// jedikim72
// - 디버깅출력함수
//------------------------------------------------------------------------
#ifdef DEBUG_OUTPUT
 #define debugLog(...) { char acTemp[2048]; \
                                      char acTemp2[2048]; \
                                      NiSprintf(acTemp, 2048, __VA_ARGS__); \
                                      NiSprintf(acTemp2, 2048, "[L%d]:%s - %s", __LINE__, __FUNCTION__, acTemp ); \
                                      OutputDebugString( acTemp2 ); \
                                    }
#else
 #define debugLog(...) ((void)0)
#endif
//------------------------------------------------------------------------

 

빌딩모드와 상관없이 디버깅 메세지를 출력하는 메써드가 필요해서 부랴부랴 만든 매크로.

(기존 매크로는 사용하기 불편해서... - -a)

 

매크로 가변인자를 사용하여 가변인수를 받아 출력할 수 있다.

사용예) debugLog("%.2f, %.2f, %.2f\n", pos.x, pos.y, pos.z);

또한 VS IDE 출력창 뿐만 아니라, 실행파일만 독립적으로 실행해도 DebugView 유틸을 통해 디버깅 출력 메세지를 볼 수 있다는 장점이 있다.

 

 

이제까진 TraceWindow를 써서 출력했는데, 프로젝트에 매번 관련 모듈 삽입하는 것도 귀찮고 해서 아예 매크로로 빼버려 간단한 구문 삽입만으로 간편하게 작업을 완료할 수 있게 했다.

 

 

 

DebugView와 함께 구동시킨 작업중인 데모 스크린샷

그나저나,

DebugView 유틸은 첨부파일로~!



출처  : http://jedikim72.blog.me/10079110907

반응형
Posted by blueasa
, |

이펙트 작업을 위해서... 이런것들이 필요 합니다.^^

 

회사를 옮길때 마다 부탁을 해야 하는 겨우가 생기더군요.^^

그렇게 중요한 내용은 아니지만 작업 할때 가끔 필요하다라고 생각이 드는 경우가 있어서...

나중에 프로그래머님들게 부탁 좀 할려고 정리좀 해봅니다.^^

 

간혹 지원을 하지 않는 엔진이 있어서...^^ 

 

 

------------------ Tip ------------------

오른손 좌표계: OpenGL 사용.

 

왼손 좌표계: Direct 3D 사용.

 

[축:axis]

-월드 축: 항상 고정이 되어 있는 축. 변화지 않는 축 입니다.

             (지구의 남과 북이 변화지 않는것 처럼, X, Y, Z,절대 절대 변화지 않는 축)

 

-로컬 축: 움직임에 따라, 축이 바라 보는 방향이 변화는 축

             ( 오브젝트 생성시 가지고 있던 축. 움직임에 따라 항상  축은 유지하되, 바라 보는 방향은

                변한다.)

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

 

[ 이펙트 작업에 필요한 기능 ]

 

1) 캐릭터에 이펙트 작업시 링크 기능 지원.

-아래 이미지 처럼 각각의 Biped와 Bone, Dummy, 특정네임(프로그래머가 설정해준 네임), 등등... 이펙트가 필요로 하는 모든 네임에 링크가 가능 해야 한다.

 

-빨강점은 이펙트와 링크가 되면 위치하는 지점.

 

-캐릭터의 이펙트 작업시.

 *Biped와 Bone, Dummy, center, 특정네임에 로컬 축, 월드 축을 지원.

 *Biped와 Bone, Dummy, center, 특정네임에 링크 방식과 비 링크 방식 지원.

  (비 링크 방식일때는 워치또는 회전 값만을 사용 할뿐 Biped와 Bone, Dummy, center

   특정네임에 움직임에 반응 하지 않는다.)

*버프 계열 이펙트 작업시 머리에 생성 되는 이펙트 지원.

 (머리에서의 일정 높이를 항상 유지 하며, 캐릭터의 이동시 같이 움직인다. 단 캐릭터의 회전

  값을 인식 해서는 안된다.)

 

 

2) 메쉬 오브젝트가 지원.

-맥스에서 작업한 메쉬 오브젝트의 move, rotate, scale, UVmap 애님, opasity 등을 지원 해야 한다.

 

-씨퀀스 및 16분할 맵 소스 지원.

 

-2-sided 지원.

 

 

 3) 다양한 쉐이더 모드 / 레이어 모드 지원.

-add, multiply, alpha인식, overlay, colorkey.. 등등 다양한 레이어 모드 지원.

(포토샾의 레이어 기능을 참고)

 

-맥스에서의 기본적인 meterrial 과 글로우 효과, 고스트 효과, 카멜레온 효과, 굴절 효과 같은 특수한 쉐이더 효과들이 지원 되야 한다.

(아래 이미지는 쉐이더 효과를 합성툴에서 만들어 본 이미지)

 

4) 기본 빌보드 지원

-기본 적으로 이펙트 툴에 파티클, 빌보드 방식이 포함 되어 있지만, 모든 엔진이 그런 것이 아님으로 필요시 프로그래머에게 요청을 해야 한다.

 

-빌보드는 (단독1~5정도)으로 사용 할때는 메쉬와 비슷 하지만, 여러개(10개 이상)를 사용 하며, 파티클과 비슷한 개념으로 생각 해야 한다.

(파티클 하나 하나를 보면 빌보드와 비슷 하다고 보면 된다. 간다하게 맥스에서 파티클에 맵을 한번 해보면 알수 있다.)

 

-기본 빌보드는 맥스 Plane[정 사각형 판]이라고 보시면 되고, 기본 빌보드는 항상 카메라만을 주시 하면서 정면만을 보여준다.

 

-기본 빌보드의 갯수 증가 기능 및 위치 랜덤 생성 기능.

(파티클의 기능에 누가 되지 않는 만큰의 갯수 약 5~8개 정도이며, 생성시에는

  위치가 랜덤하게 발생 해야 한다.)

 

-2-sided 지원.

 

-빌보드 종류.

 *기본적인 빌보드.(항상 카메라만 본다)

 *방향을 바꿀수 있는 빌보드.(원하는 방향을 설정 할수 있다.)

 *박스 형태의 빌보드.(위/아래는 면이 없다.)

 *원통형의 빌보드.(위/아래는 면이 없으며, 면을 수를 조절이 가능 해야 한다.)

 *한쪽 축이 고정된 빌보드이며, 카메라만 항상 바라 본다.

  ( 기본 빌보드에 1개의 축을 고정 해준다.)

 *기타... 엔진에서 지원되는 빌보드.

 

-빌보드 지원 기능

 *move, rotate, scale, opasity 기능 지원.

 *씨퀀스 및 16분할 맵 소스 지원.

 *loop 기능 지원

 *Biped와 Bone, Dummy, center, 특정네임에 로컬 축, 월드 축을 지원.

 *Biped와 Bone, Dummy, center, 특정네임에 링크 방식과 비 링크 방식 지원.

  (비 링크 방식일때는 워치또는 회전 값만을 사용 할뿐 Biped와 Bone, Dummy, center

   특정네임에 움직임에 반응 하지 않는다.)

 

5) 트레일 효과 지원.

 -검의 잔상 기능.

  (맥스에서고스트 트레일 효과와 비슷 기능.)

 

-잔상의 왜곡 효과.

 (굴절 현상)

 

5) 파티클 툴의 부수적인 기능 지원.

-기본적으로 particleIllusion정도의 툴.

 

- Biped와 Bone, Dummy, center, 특정네임에 로컬 축, 월드 축을 지원.

 

-Biped와 Bone, Dummy, center, 특정네임에 링크 방식과 비 링크 방식 지원.

  (비 링크 방식일때는 워치또는 회전 값만을 사용 할뿐 Biped와 Bone, Dummy, center

   특정네임에 움직임에 반응 하지 않는다.)

 

-파티클을 모으는 방식 지원.

 (보통은 퍼지는 기능은 되지만, 기를 모을때 사용할수 있는 기능은 지원 안 하는 경우가 많다.)

 

-링크된 파티클과 파티클 사이에 보간 기능 지원.

 (Bip01 R Thigh와 Bip01 R Calf 사이에 파티클 링크시, 링크된 위치에서만 파티클이 발생 하기

  때문에, 링크된 사이에는 파티클이 발생 할수 있게 해준다.)

 

-파티클의 트레일 발생 지원.

 (귀무자의 기를 빨라 드리는 효과를 참고 하면 된다.)

 

-파티클 타이밍 조절 지원.

(1프레임에 100개의 파티클을 전부 불출 또는 10프레임 있다가 100프레임을 전주 분출 등등..)

 

-파티클 발생 방식.

 *움직임에 영향을 받지 않는 방식.

   (별이 반짝이는 것처럼, 처음 생성 위치에서 발생 하면 아무런 영향을 받지 않으며, 파티클의

    꼬리가 생기지 않는다.)

 *움직임에 영향을 받는 방식

   (대표적으로 파티클의 꼬리가 발생 한다.)

 

6) 데칼 기능 지원.

-마법진과 또는 바닥 이펙트 처리에 사용 되는 방식.

(바닥의 왜곡면과 상관 없이, 발생 하는 기능. 간혹 왜곡이 아주 심한 경우에는

 이펙트 모양이 늘러지게 보이는 경우가 있다.)

 

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

아래의내용들은 이펙트 작업시 필요 하다라고 느끼거나, 있어으면 하는 것들을 적어 본 것입니다.

 그렇다고, 꼭! 이 기능이 이었야 작업을 잘 할수 있는 것은 더더욱 아닙니다.

부족함에 약간의 도움을 주기 위해서 라는것을 알아 주시길....^^

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

반응형

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

강의자료 - 파티클 예제  (0) 2011.03.22
Setup about Effect Dumy…  (0) 2011.03.21
파티클 컨트롤 해보기  (0) 2011.02.24
이펙트 출력  (0) 2011.02.08
검광, 검기 잔상 효과에 대하여...  (1) 2011.01.21
Posted by blueasa
, |

Delta3D API Documentation

Link / 2011. 1. 25. 01:49
반응형
Posted by blueasa
, |
반응형

'Utility > Doxygen' 카테고리의 다른 글

[삽질] KingsTools 함수등 정보가 안보일 때..  (0) 2012.06.12
자주쓰는 DoxyGen 주석  (0) 2011.06.17
Posted by blueasa
, |

Gamebryo 관련 사이트

Link / 2011. 1. 21. 01:32

출처: http://stnzone.com/gboard/blog/?id=1003 -> 자존심님의 블로그

 

 

 

http://www.gamebryo101.com/

 

호오... 상당히 폐쇄적인 겜브리오 국내 커뮤니티에 비하면 여기 어떤 곳일지??

 

일단 링크!!!



출처 : http://jedikim72.blog.me/10038718610

반응형
Posted by blueasa
, |
반응형
Posted by blueasa
, |

게임코디에서 글을 읽다가 검기 이펙트 구현에 대한 글을 보았다.

지피지에서 검광으로 검색해서 찾은 쓰레드에서 얻은 정보들~!

 

 

지피지의 관련 쓰레드

http://www.gpgstudy.com/forum/viewtopic.php?t=18848&highlight=%B0%CB%B1%A4

 

 

D3DXVec3CatmullRom 함수를 이용해 Catmull-Rom Splines를 소개하는 사이트

http://www.mvps.org/directx/articles/catmull/#demo

 

 

Catumull-Rom 스플라인을 이용한 Path 보간 데모

http://www.mvps.org/directx/articles/catmull/lightmap.zip

 

 

 

 

 

그나저나,

감버려에서도 검기, 검광 잔상을 보여주는 샘플이 있긴하다.

Eturnum 이란 풀데모를 보면 NPC가 들고 다니는 창의 날에 검기 잔상이 알흠답게 남는다.

나중에 필요할 때 자세히 봐둬야할듯~

 

대충 훑어보니 동적인 TriShape를 검기의 보간된 궤적에 맞춰 생성하고 아래 Swoosh 텍스쳐를 바르는 것 같다.

 

요건 검기가 보이는 순간의 스샷



[출처] 검광, 검기 잔상 효과에 대하여...|작성자 엉클 제다이


출처 :


ㅇㄹㅇㄹ

반응형

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

강의자료 - 파티클 예제  (0) 2011.03.22
Setup about Effect Dumy…  (0) 2011.03.21
파티클 컨트롤 해보기  (0) 2011.02.24
이펙트 출력  (0) 2011.02.08
이펙트 작업에 필요한 기능  (0) 2011.01.27
Posted by blueasa
, |
        다음 메쏘드를 이용하여 알아내면 됩니다.
       
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
       

        사용법은 아래 소스코드를 보시고 이해 하시면 될것 같네요..

       
        동시 키 눌림
은 아래와같이 OR (|) 연산자를 이용하시면 되는데..
        간혹 Ctrl + C, Ctrl + V, Ctrl + X 등이 캐치 되지 않는 경우가 있습니다.

        그럴경우는 툴박스나, 메뉴바, 컨텍스트메뉴 (마우스 오른쪽메뉴) 에서 해당 숏컷이 등록되어 있는지 확인하시고,
        등록이 되어 있다면, 해당 숏컷에 이벤트를 등록 해 주시면 됩니다.


        메소드를 보시면 제일 마지막에 
       
        return base.ProcessCmdKey(ref msg, keyData);
       

        이런 부분이 있습니다.

        저 부분이 다음 이벤트로 이벤트를 넘겨주는 역할을 하게 되는것이죠..

        즉 ProcessCmdKey 가 받은 이벤트를 오버라이딩하여 우리가 원하는 코드를 넣었으니,
        다시 원래 가야할 길로 보내주는겁니다.

        KeyDown 이나.. 그 전에 어떤 이벤트 핸들러가 있다면 그쪽으로 넘어가겠죠..;;;
        정확한 내용은 찾는데로 업뎃하겠습니다..


        예제 소스를 보시면 쉽게 이해가 되시리라 믿습니다.



        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            switch (keyData)
            {
                case Keys.Down:
                case Keys.Up:
                case Keys.Right:
                case Keys.Left:
                case Keys.Control | Keys.Down:
                case Keys.Control | Keys.Up:
                case Keys.Control | Keys.Right:
                case Keys.Control | Keys.Left:
                    // 방향키, 혹은 컨트롤키 + 방향키가 입력되었을때
                    // 처리, 혹은 다른 메쏘드 호출을 여기에 적어주시면 됩니다.
                    break;

                case Keys.Control | Keys.X:
                    // 잘라내기 (Ctrl + X)
                    // 처리, 혹은 다른 메쏘드 호출을 여기에 적어주시면 됩니다.
                    break;

                case Keys.Control | Keys.C:
                    // 복사하기 (Ctrl + C)
                    // 처리, 혹은 다른 메쏘드 호출을 여기에 적어주시면 됩니다.
                    break;

                case Keys.Control | Keys.V:
                    // 붙여넣기 (Ctrl + V)
                    // 처리, 혹은 다른 메쏘드 호출을 여기에 적어주시면 됩니다.
                    break;

                default:
                    break;
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }


반응형

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

DataGridView to XML  (0) 2011.03.23
ToolTip 사용하기  (0) 2011.02.11
[펌] 외부 응용프로그램 실행하기 (Process.Start 메서드) - CMD  (0) 2011.01.13
sendmessage in C#  (1) 2010.12.27
C# SendMessage Keypress  (1) 2010.12.26
Posted by blueasa
, |