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

 

 

댓글 없음: