put_MessageDrain 메서드는, 비디오 윈도우로부터 마우스 메시지와 키보드 메시지를 받아들이는 윈도우를 지정합니다.

DirectShow 를 사용한 화면에서 마우스나 키보드 이벤트가 발생시
즉 재생되고 있는 영상위에서 마우스 이벤트가 발생하거나,
사용자가 키보드입력 등을 할경우
기본적으로 이벤트는 자신의 부모 스래드(핸들)에게 이벤트를 전달합니다.
하지만 영상을 생성한(비디오윈도우를 생성한) 핸들이 아니고,
다른곳(다른윈도우 등)에서 이벤트를 받고자할경우.

put_MessageDrain 메서드를 사용하면됩니다.

CComQIPtr<IVideoWindow, &IID_IVideoWindow> pWindow = m_pGB;
    if(!pWindow)
    {
        Error(TEXT("Could not get video window interface"));
        return hr;
    }

    // set up the preview window to be in our dialog
    // instead of floating popup
    //
    RECT rc;
    ::GetWindowRect(hwndPreview, &rc);

    hr = pWindow->put_Owner((OAHWND) hwndPreview);
    hr = pWindow->put_Left(iX);
    hr = pWindow->put_Top(iY);
    hr = pWindow->put_Width(iWidth);
    hr = pWindow->put_Height(iHeight);
    hr = pWindow->put_Visible(OATRUE);
    hr = pWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
    hr = pWindow->put_MessageDrain((OAHWND)hwndPreview); // 이벤트를 전달할 핸들
Posted by 빨강토끼
,
c:\program files\microsoft sdks\windows\v6.0a\include\qedit.h(498) : fatal error C1083: Cannot open include file: 'dxtrans.h': No such file or directory

vs2008 에서 DirectShow 작업을 할때 상기와 같은 에러가 나면서 컴파일이 안되었습니다.
이유는 dxtrans.h 를 찾을 수 없다는 것입니다.

예전에는 DirectShow 가 DirectX SDK안에 있었는데 언제부터인가 플랫폼 SDK로 옮겨져서
DirectShow 을 이용한 개발을 위해서 별도로 DirectX SDK를 설치하지 않아도 되는듯 합니다.

아무튼...

qedit.h 를 include 하기 전에 아래와 같은 코드를 삽입하면 해결됩니다.

#pragma include_alias( "dxtrans.h", "qedit.h" )

#define __IDxtCompositor_INTERFACE_DEFINED__

#define __IDxtAlphaSetter_INTERFACE_DEFINED__

#define __IDxtJpeg_INTERFACE_DEFINED__

#define __IDxtKey_INTERFACE_DEFINED__

#include <qedit.h>


Posted by 빨강토끼
,
Posted by 빨강토끼
,
ProjectName.exp :
warning LNK4070: /OUT:ProjectName.dll directive in .EXP differs from output filename "ProjectNameD.dll"; ignoring directive

원인 :
상기 경고는 DLL ProjectSetting 에서 Output file name 을 바꾸면 나타나는 현상입니다.
( ProjectName.dll -> ProjectD.dll )
.def 파일의 내용중에 아래 와 같이 ProjectName.dll 로 되어있어서
.exp 파일과 결과물이 달라서 발생하는 현상입니다.

해결방법 :
ProjectName.def 파일을 하나 복사해서 아래와 같이 수정합니다.
-----------------------------------------------------------------------------------
LIBRARY : ProjectName
----------------------------------------------------------------------------------
항목을
----------------------------------------------------------------------------------
LIBRARY : ProjectNameD
----------------------------------------------------------------------------------
이렇게 수정합니다.

그리고 Project Setting -> Link -> Category:General -> Project Options : /def:ProjectNameD.def
로 수정하시면 됩니다.
Posted by 빨강토끼
,
다이얼로그에서 타이틀바를 제거 하기위해서 함참동안 해매였습니다.
사실전에 알고있었는데 기억이 잘안나서 고생을 했습니다.
그래서 제 블로그에 기록해 놓을려구요.

먼저 다이얼로그의 속성에서 Border 를 None으로 바꾸고
(Title bar 와 System menu 가 언체크됩니다.)

그리고 소스상의 OnInitDialog() 에서
아래를 추가합니다.

    // 작업표시줄에 표시하고자 하는 문자열 지정.
    SetWindowText("title);
   
    // WS_SYSMENU 스타일을 추가한다.
    ModifyStyle(0, WS_SYSMENU | WS_MINIMIZEBOX,0);

위내용은 삽입하는 이유는
1.작업표시중에 Title 를 추가
2.종료기능을 위하여 WS_SYSMENU 를 추가 (작업표시줄에서 마우스오른쪽버튼)
3.최소화기능을 위하여 WS_MINIMIZEBOX 를 추가 (작업표시줄에서 마우스오른쪽버튼)
Posted by 빨강토끼
,
http://www.telnet.or.kr/sec_directx/
한글이라서 좋아요^^
Posted by 빨강토끼
,
로그를 보니 이글에 대한 검색이 많더군요.
그래서 기존의 VB(비베)에 C++ 관련 정보도 추가해보았습니다.

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

오늘 이것때문에 시간을 너무 많이 소비하였다.
사실 알고보면 이것때문에 오히려 개발시간이 단축된건 사실이다.
인터넷 요기조기를 돌아보고 삽질을 한결과 알아낸 사실 몇가지를 기록하겠습니다.

일단 findwindow 가 머냐면...
여러가지 용도로 쓰겠지만
제가 사용한 목적은 특정 프로그램이 실행중인가를 알아내기 위해서입니다.
가령 B 라는 프로그램이 실행중인지 아닌지 A라는 프로그램이 알아내기 위해서입니다.
이것또한 자세히 들어가보면 저는 한프로그램에서 (VB) shell 명령어로
두 프로그램을 실행시키는데 순차적으로 실행이 되어야됩니다.

나중에 해당기능이 완성되면 별도의 글로 정리를 하겠지만
카트라이더 처럼 런처를 만들려고 합니다.
일단 프로그램이 설치되어있는가 확인후 만일 없거나 버젼이 다른경우
설치프로그램을 다운로드하고 설치를 한후에
프로그램을 실행시키는 방식입니다.

서론이 넘길었군요.
머 아는것도 별로 없는게 말만 많았습니다.

일단 vb에서 findwindow를 사용하기 위해서는 API를 선언해야합니다.



Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

그리고 해당 프로그램의 class 명이나 caption 값을 알아야하는데
어떻게 하느냐면. caption는 의외로 간단합니다.
프로그램을 실행시키면 가장상단에 있는것 있죠?
브라우져를 예로 들면 <title>...</title> 부분입니다.
그런데 class 명을 알고 싶거나 caption 값이 이상하게 안된다? 하면
C++ 를 깔면 같이 깔리는 spy++ 이라는 프로그램을 실행시킨후에
Ctrl + F 를 누른후 + 라로 마치 과녁같이 생긴것을 해당프로그램에
드래그 드롭을 하면 관련정보가 주르륵 나옵니다.

여기서....

제가 가장 시간을 잡아먹은 부분입니다.

Dim lngHwnd As Long '프로세스 확인

Private Sub Form_load()
  lngHwnd = FindWindow(vbNullString, "Sample App")
  'MsgBox lngHwnd
  If lngHwnd = 0 Then
  Timer1.Enabled = False
  executeFcs
  Else
  chkInstall
  End If
End Sub

위에 코드중에서 이부분

lngHwnd = FindWindow(vbNullString, "Sample App")

첫번째인자가 Class명입니다.
두번째인자가 caption값이구요...

class 명을 모르면 vbNullString 이런식으로 넣으면 되구요
반대인경우에는 caption 값에 vbNullString 를 넣는 식으로
하시면 됩니다.

정상적으로 다른 프로그램이 실행중이면 Hwnd 값이 나오고
실행중이 아니면 0 이 반환됩니다.

그런데 왜 시간을 소비했냐면 물론 전제적으로 프로그램이 잘안되서
이것저것 만지다보니 이렇게도 해보고 저렇게도 해보다가
코드가 뒤죽박죽....머이런 식이었습니다.

C++ 에서는

HWND hWnd;

hWnd = FindWindow( NULL,"Sample App");
위의 설명과 똑같이
첫번째 인자는 클래스이름이고
두번째 인자는 윈도우이름입니다(caption).

if(hWnd)
{
    SetForegroundWindow((HWND)(((DWORD)hWnd) | 0x01));
    return 0;
}

위에 코드는 클래스이름 또는 윈도우 제목이 일치하는 윈도우를 찻았다면
SetForegroundWindow 함수를 사용하여 그 윈도우가 활성 윈도우가 되게 하는 코드입니다.

그럼....오늘도 행복한 프로그래밍 하세요.
저도 행복한 프로그래밍을 하도록 노력하겠습니다.^^;
Posted by 빨강토끼
,
회사에서 업무용으로 SVN을 사용하고 있습니다.
계정을 등록하고 CheckOut를 하고 update를 하면서 작업을 하고는
commit를 하려하니 위의 제목과 같은 에러가 나면서 commit이 안되는 겁니다.
네이버등의 한국사이트에서는 정보를 얻을수가 없어서
구글에 들어가서 검색을 해보니 역시나 정보를 얻을수가 있었습니다.
잘못하는 영어실력이라서 한번에 이해가 되지않아 두세번 읽으니 이해가 되더군요.
사실 간단한 내용이였는데...ㅡㅡ;
역시 영어가 중요하다는걸 새삼 깨닮게 되었습니다.

Subversion, MKACTIVITY, and 403 forbidden Headaches

내용인즉슨
저장소주소를 잘확인해 보라는 겁니다.
예를 들어
My URL: http://svn.foobar.com/foobar
이라고 저장소 주소를 적여놨는데
사실은
My URL: http://svn.foobar.com/FooBar
라는 식입니다.
결국 대소문자가 다르면 업데이트(read)를 되지만 케밋(writer)은 안된다는 겁니다.

차~암 쉽죠...잉....


Posted by 빨강토끼
,

Wide Char 와 ANSI 사이의 변환을 간편하게 해주는 매크로입니다.
 매크로 인자 결과 
 A2CW  LPCSTR  LPCWSTR 
 A2W  LPCSTR   LPWSTR
 W2CA  LPCWSTR  LPCSTR
 W2A  LPCWSTR  LPSTR
 T2COLE  LPCTSTR  LPCOLESTR
 T2OLE  LPCTSTR  LPOLESTR
 OLE2CT  LPCOLESTR  LPCTSTR
 OLE2T  LPCOLESTR  LPCSTR

예)
USES_CONVERSION;

TCHAR widechar[]=L"sample";
char ansichar[10];
ansi = w2a(widechar);
Posted by 빨강토끼
,
둘다 이벤트아이디에 따라 분기하는것은 같으나

GetMessage() 는 이벤트가 들어올때까지 내부적으로 loop를 돌며 기다립니다.
이와 반대로 PeekMessag() 는 이벤트가 있나보고 없으면 다음 코드로 넘겨버린다.

인터넷을 찾아보니 어떤분은 이 이유로 PeekMessage 를 사용하는것이 GetMessage를 사용하는것 보다
효율적이라고 말을 합니다.
http://mygeni.tistory.com/60

딴지를 걸려고 링크를 건건 아니구요.^^

참고 하시라구요...
Posted by 빨강토끼
,