2010년 7월 14일 수요일

더블 버퍼링

하나의 다이얼로그에서 캠 영상처리와 플래시콘트롤을 동시에 드로우 하다보니 깜빡거림이 발생거림

 

=> 더블 버퍼링 시도 중 허나..... 어찌 하는지 모르겠음;

2010년 7월 10일 토요일

영상 => Message

과제:

1. 어떤 패턴을 인식할것인가 :

 

2. 인식한 패턴을 어떤 메세지로 전달할것인가:

message 정의하기 =>

http://ubo.pe.kr/xe/library/274

 

http://blog.naver.com/a_jel?Redirect=Log&logNo=140057994282

 

http://blog.naver.com/numicgod?Redirect=Log&logNo=60051345765

 

http://ddoong2.com/55

 

3. message를 어떻게 받아들일것인가:

message 핸들러 구현 =>

http://blog.naver.com/whitebj82?Redirect=Log&logNo=120090498569

 

http://blog.naver.com/zzabcd?Redirect=Log&logNo=100021856617

 

4. 마우스와 키보드가 동시에 사용되는데 포커스 전환을 어떻게 할것인가 혹은 같은 다이얼로그에...구현

 

 

 

 

Mouse 콘트롤 관련

일단은 키보드로 입력을 받아서 방향키로 마우스 좌표 변경하는건 성공

 

http://blog.naver.com/wjdghk26?Redirect=Log&logNo=60067656387 => PreTranslateMessage 사용

 

문제점:

1. 두개 이상의 키를 동시에 입력했을때 둘중 하나만 입력 된다

일단은 해결 => http://blog.naver.com/pjy3124?Redirect=Log&logNo=120048863080 

 

여기서 파생되는 의문점&문제점

 

실제 마우스 처럼 자유로운 움직임을 보여주기 위해서는 x좌표와 y좌표가 따로 따로 증감해야 하는데 지금의 코드로 그게 구현이 될것인가?

 

아니라면 어떤 방법으로 구현할 것인가

 

 

다음쟁점:

 

 마우스 클릭 메시지 발생했을때 현재 마우스 콘트롤 다이얼로그에 대한 포커스를 잃어버리지 않는것

 CWnd::FindWindow(); 사용하여 현재 윈도우의 핸들을 받아서

 SetForegroundWindow(); 로 현재 윈도우에 포커스를 다시 준다.

 

해결?

 

다음쟁점:

 

return키 입력으로 마우스 Left 클릭을 발생시켰는데 키 입력에 민감하게 반응하여 더블클릭발생

Sleep() 으로 해결해보자. => 안됨

 해결 => 바보같이 LEFTDOWN을 두번 날리고 있었음 -_-; LEFTDOWN -> LEFTUP 으로 수정

2010년 7월 8일 목요일

예선 과제 관련

카메라가 무얼 보는지는 일단 두번째 문제 ( 그동안 하던 소스가 있기때문에)

 

중요한건

 

들어온 영상을 하나의 message로 변환하여 적당한 콘트롤로 보내주는것

 

일단은 쉽게 플래시로 하기로 하여서 플래시 콘트롤을 대화창에 삽입

 

버튼을 여러가지 만들어서 버튼을 클릭하면 플래시 콘트롤로 매핑된 키보드 메세지 send

 

여기서 문제

 

키보드 메세지를 보내는것까지는 성공

 

마우스와 다르게 (마우스는 좌표만 변경하면 움직임... 클릭에서도 같은 문제 예상)

 

KEY_DOWN KEY_UP 두가지 상태가 존재하는데

 

KEY_DOWN은 되는데 KEY_UP을 언제 날려야하는지....를 모르겠음 이걸 굳이 time을 걸어야 하는건지..

 

일단 관련 API는 죽어라 찾아놨으니 예선 과제 자체를 변경하는것도 나쁘지 않을듯

 

문제 관련 :

 

KEY_DOWN 메세지를 날리고 KEY_UP 메세지를 암만 날려도 안됨 포커스 관련 문제인거 같음? => 아니었음

KEY_UP 메세지 날리는 타이밍의 문제인듯

 

문제 관련 2:

 

플래시를 실행시키고 키보드로 조작한뒤에 SPY++ 로 메세지를 훔쳐? 보니 내가 생각했던것과는 다르게

메세지가 발생하는듯

 

WM_KEYDOWN이 발생하긴 하는데 중간에 WM_CHAR 값이 같이 발생

 

'w'키 로 발생시킨 메세지

 

<00805> 000A0C02 P WM_KEYDOWN nVirtKey:'W' cRepeat:1 ScanCode:11 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00806> 000A0C02 S WM_GETDLGCODE
<00807> 000A0C02 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTTAB | DLGC_WANTCHARS
<00808> 000A0C02 S WM_GETDLGCODE
<00809> 000A0C02 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTTAB | DLGC_WANTCHARS
<00810> 000A0C02 P WM_CHAR chCharCode:'119' (119) cRepeat:1 ScanCode:11 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00811> 000A0C02 S WM_GETDLGCODE
<00812> 000A0C02 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTTAB | DLGC_WANTCHARS
<00813> 000A0C02 S WM_GETDLGCODE
<00814> 000A0C02 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTTAB | DLGC_WANTCHARS
<00815> 000A0C02 P WM_KEYUP nVirtKey:'W' cRepeat:1 ScanCode:11 fExtended:0 fAltDown:0 fRepeat:1 fUp:1

 

postmessage로 보낸 메세지

 

<01005> 00260BF6 P WM_KEYDOWN nVirtKey:'A' cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<01006> 00260BF6 S WM_GETDLGCODE
<01007> 00260BF6 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTTAB | DLGC_WANTCHARS
<01008> 00260BF6 S WM_GETDLGCODE
<01009> 00260BF6 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTTAB | DLGC_WANTCHARS
<01010> 00260BF6 P WM_KEYUP nVirtKey:'A' cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<01011> 00260BF6 P WM_CHAR chCharCode:'97' (97) cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<01012> 00260BF6 S WM_GETDLGCODE
<01013> 00260BF6 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTTAB | DLGC_WANTCHARS
<01014> 00260BF6 S WM_GETDLGCODE
<01015> 00260BF6 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTTAB | DLGC_WANTCHARS
<01016> 00260BF6 P WM_CHAR chCharCode:'97' (97) cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<01017> 00260BF6 S WM_GETDLGCODE
<01018> 00260BF6 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTTAB | DLGC_WANTCHARS
<01019> 00260BF6 S WM_GETDLGCODE
<01020> 00260BF6 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTTAB | DLGC_WANTCHARS
<01021> 00260BF6 S WM_GETDLGCODE
<01022> 00260BF6 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTTAB | DLGC_WANTCHARS

 

senddlgitemmessage로 보낸 메세지

 

<00999> 00260BF6 S WM_KEYDOWN nVirtKey:'W' cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<01000> 00260BF6 R WM_KEYDOWN
<01001> 00260BF6 S WM_KEYUP nVirtKey:'W' cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<01002> 00260BF6 R WM_KEYUP
<01003> 00260BF6 S WM_GETDLGCODE
<01004> 00260BF6 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTTAB | DLGC_WANTCHARS

 

 

분석결과:

 

senddlgitemmessage는 아주 편리하게 해당 콘트롤로 메세지를 보낼수는 있는데 원하는 메세지와 너무 다르다

 

중간 중간 뭔가 상당히 많이 빼먹음 => WM_GETDLGCODE

 

http://www.winapi.co.kr/reference/Message/WM_GETDLGCODE.htm

 

postmessage가 가장 근접한 결과를 보여주는데 WM_CHAR와 WM_KEYUP의 순서가 다르다 여기서 문제가 생기는듯

 

분석결과2 :

 

keyup 메세지만 같은 방식으로 보내본 결과

 

senddlgitemmessage

 

<00075> 00070E74 S WM_KEYUP nVirtKey:'W' cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00076> 00070E74 R WM_KEYUP
<00077> 00070E74 S WM_GETDLGCODE
<00078> 00070E74 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTTAB | DLGC_WANTCHARS

 

postmessage

 

<00079> 00070E74 P WM_KEYUP nVirtKey:'A' cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00080> 00070E74 P WM_CHAR chCharCode:'97' (97) cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00081> 00070E74 S WM_GETDLGCODE
<00082> 00070E74 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTTAB | DLGC_WANTCHARS
<00083> 00070E74 S WM_GETDLGCODE
<00084> 00070E74 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTTAB | DLGC_WANTCHARS
<00085> 00070E74 S WM_GETDLGCODE
<00086> 00070E74 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTTAB | DLGC_WANTCHARS

 

senddlgitemmessage로 wm_keydown -> wm_char->wm_keyup 순서대로 해보자

 

=> 예상은 했지만 안먹힘

 

sendinput 으로 해보자 => 이것도 예상은 했지만 안먹힘

 

이유:

 

sendinput 자체가 특정 윈도우나 콘트롤로 지정해서 보내는게 아니고 현재 상위 윈도우로 가상의 인풋을 날리는데 getDlgItem 으로 플래시 콘트롤 핸들은 가져왔으나 setforgroundwindow 로 플래시 콘트롤을 상위로 올리는게 뭔가 꼬이는듯

 

참고자료 :

 

윈도우 가상 키값

 

http://msdn.microsoft.com/en-us/library/dd375731(v=VS.85).aspx

 

키 상태 가져오기

 

http://blog.naver.com/silver6688?Redirect=Log&logNo=60051209034

 

http://msdn.microsoft.com/en-us/library/ms646301(VS.85).aspx

 

http://msdn.microsoft.com/en-us/library/ms646293(v=VS.85).aspx