어떤 분께서 이런 질문을 하셨어.(필자가 가장 바빠서 신경도 못 쓰고 있을때, 올리셨다.)

 늦었지만, 답변을 작성 하기로 한다.


 ADBKeyBoard에 관련되서는 이전글[각주:1]을 읽어 보면, 답변이 될 것같다.


 먼저 ADBKeyBoard[각주:2]가 필요하다.

 

 ADBKeyBoard란, UNICODE을 ADB의 BroadCast의 데이터를 키보드 apk을 통하여 입력을 하게 만드는 것이다.


 ADB로만으로 UNICODE을 넣게 만드는게 아니라는 말이다.(만약, ADB로만 UNICODE을 넣길 원한다면, ADB을 뜯어 고쳐라.)


 1. ADBKeyBoard을 다운 받는다.(필자는 ADBKeyBoard.apk가 있지만, 지금은 구할 수 없어져서 소스를 다운 받았다.)

  소스를 받고 싶으면, 이전글을 참조 하실길...


 


 2. APK로 컴파일해서 해당 폰에 설치한다.(에뮬레이터에 설치한다.)


 3. 설치된 폰에서 키보드 설정을 한다.

     혹은, ADB에 다음과 같은 명령을 준다.


     adb -s 해당 폰 shell ime set com.android.adbkeyboard/.AdbIME


     키보드 설정하는 명령어다.

 


밑에 ADB Keyboard {ON} 이라고 되어 있으면, 제대로 작동 중인 것이다.


 4. 3. 까지 하면, 이제, ADB의 명령으로 키보드를 입력할 수 있게 되었다.

    이제, 브로드 캐스트를 이용해서 입력하게 만든다.

    


 깜빡하고, "한글 입력" 이렇게 스페이스가 붙었는데... 실수한 것이다.(보면, broadcast에서 입력 부분이 오류나는걸 알 수 있다.)

 스페이스 부분은 특수문자(\space 라는 형태로 파싱을 해서)를 추가시켜서 만들도록 하면, 입력이 된다.


 참고로 이전글에 소개한 사이트에서 이런 설명이 다되어 있다.(영문이라서 그렇지...)

 

  1. http://jihadw.tistory.com/103 [본문으로]
  2. https://github.com/senzhk/ADBKeyBoard [본문으로]
Posted by JunkMam
,

 ADB로 Unicode을 입력할 수 있는지 궁금해서 구글링을 하다가 찾은 것이다.

 (ADB로 한글을 입력 할 수 있다!)


 하는 방법은 소스 사이트에 들어가서 APK을 설치한 후(불안하면, 소스만 보고 필요한 부분말 빼가서 처리하면 된다.) 키보드를 설정한 후에 ADB의 브로드 캐스트를 보내주면 된다.


 원리는 APK로 만들어진 가상 키보드가 BroadCastReciver가 존재하고, 이것이 ADB로 보내는 브로드 캐스트를 받는다.

 받은 브로드 캐스트의 내용은 가상 키보드가 내용물로 처리해주는 방식이다.


 키보드 기본 설정을 해야되는 불편함만 제외하고, 이걸 이용하면, ADB가 사용하는 BroadCast을 이용해서 UNICODE을 송신을 받아서 자동으로 입력을 받을 수 있게 해준다.


 ADB로 키보드를 변경하는 방법도 적혀져 있다.


 한자, 한글, 영어 전부다 지원이 되는 걸 확인 했지만, 문제는 스페이스가 지원이 안된다.


 아마도 브로드 캐스트라서 그런 것 같다.


 소스가 있으니, 특정 기호 = 스페이스바. 이렇게 수정이 가능할 것이다.


 소스


 관련 질문 사이트

Posted by JunkMam
,

 BUFFALO을 이용하여 WIFI을 연결하여 사용하는 방법을 사용했으나, 제대로 작동 되지 않는 문제점이 있다.


 N300을 이용하면, 문제가 존재한다.


 와이파이가 2개 이상을 하는 것이 문제가 없는 것인지 추측된다.


 ipTIME을 이용해서 N104R을 이용해서 연결하니, 이상없다.


 WINDOWS 10에서 BUFFALO N300으로 연결이 안되었지만,

 ipTIME N104R을 연결해서 사용하는 것을 비교하면, 이상없이 작동하는 것을 보니.

 와이파이 공유기 자체의 작동 방법이 달라서 그런 것으로 추측이 된다.


 현재 변경해서 사용하니 이상없이 작동되고, WINDOWS 10에서도 이상없이 연결되는 것을 보니, 공유기를 살때 주의해서 사야될 것으로 추측이 된다.

Posted by JunkMam
,

ADB을 무선으로 연결하는 방법으로


./adb.exe shell ifconfig wlan0 을 사용할 경우.


wlan0: ip xxx.xxx.xxx.xxx mask 255.255.255.0 flags [up broadcast running multicast]


이런식으로 뜬다.


여기서 XXX.XXX.XXX.XXX을 알고 있어야한다.


예을 들어서 192.168.90.103 이라고하자.


그러면, 해당 안드로이드 디바이스는 192.168.90.103이라는 IP을 가지고 공유기랑 공유되고 있다는 것이다.


여기서 연결되는 포트를 설정하는 방법은


./adb.exe tcpip XXXX 라고 치면 된다.


이렇게 되면, IP 포트에서 XXXX을 설정하여 USB 형태가 아닌, TCP로 연산되게 된다.


./adb.exe tcpip 5037


이렇게 하면, 자동으로 USB 연결은 떨어지게되고, IP로 연동되게 된다.


이제, 연결하는 방법은


./adb.exe. connect 192.168.90.103:5037


이렇게 사용하면, 연결이 되게 된다.



하지만, 내 집에선 사용이 되지 않는다.(다른 공유기에선 사용이 가능하다.)


이유를 알아봤는데, BUFFALO N300 때문에 생기는 문제인 것 같다.


특정 설정을 해야되는지도 아직 확인을 못했다.(ADB가 WIFI을 통할때 어떻게 하는지 알고 있다면, 도움이 되겠지만, 현재로선 모른다.)


그래서 추측하건데, BUFFALO 공유기는 제대로 적용이 되지 않는다는 것이다.


이것 때문에 공유기를 변경(안 그래도 BUFFALO 공유기가 마음에 안들고 있는 참이다.)해야될 것 같다.


BUFFALO의 형태에서 WIFI을 설정한 것과 다른 것과 차이점을 찾아보자면,

WPA2로 연결 되어 있는건 이상없이 연결이 되지만,

BUFFALO는 WPA2-PSK라는 점이다.

이것 때문에 문제가 생기는 거일지도 모르겠다.


현재 확인 해야된다는 점이 있지만, 조사해봐야겠다.

Posted by JunkMam
,

 분석하였을때, swipe과 tap은 분석이 되었으나, 다중 터치에 대해서는 언급이 되어 있지 않았다.


 다중 터치를 처리 하기 위해선 먼저 터치가 시작되었다는 정보를 보내야된다.

 0003 0039 로 터치가 시작되었다는 정보가 일어난 후에

 tap이나 swipe과 동일하게, 작업을 하는데, 차이점은

 0003 002f 00000000이라는 정보가 종료 지점에서 넣게 된다는 점이다.

 이것은 다중 터치에서 일어난다.


 예을 들어서 다음과 같게 된다.


 0003 002f 00000000

 0003 0039 00000001

 0003 0035 0000000f

 0003 0036 00000001

 0003 0030 00000002

 0003 003a 00000002

 0000 0000 00000000


 이렇게가 바로 하나의 터치 인식이라는 것이다.

 여기서 다음 터치를 넣기 위해선

 

 0003 002f 00000001

 0003 0039 00000001

 0003 0035 0000000f

 0003 0036 00000001

 0003 0030 00000002

 0003 003a 00000002

 0000 0000 00000000


 이런식으로 인식이 된다는 점이다.


 간단하게 말해서

 002f는 터치의 갯수이고, 0039는 터치의 횟수, 0035 : X축, 0036 : Y축가 되는 것이다.

Posted by JunkMam
,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
#if defined(UNICODE) && !defined(_UNICODE)
    #define _UNICODE
#elif defined(_UNICODE) && !defined(UNICODE)
    #define UNICODE
#endif
 
#include <tchar.h>
#include <windows.h>
 
#include <stdio.h>
#include <stdlib.h>
 
#define MAX_LINE 4096
 
/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
 
/*  Make the class name into a global variable  */
TCHAR szClassName[ ] = _T("ADB 연결 장치");
 
//프로세스를 위한 변수
HANDLE write_in, write_out;
HANDLE read_in, read_out;
 
SECURITY_ATTRIBUTES sec;
 
long unsigned int writen=0;
long unsigned int readn=0;
 
int rtv;
 
char command[80= {0,};
char buffer[MAX_LINE];
 
STARTUPINFO si={0,};
PROCESS_INFORMATION pi;
 
int x=0;
int y=0;
 
 
int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */
 
    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);
 
    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default colour as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
 
    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;
 
    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           szClassName,       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           544,                 /* The programs width */
           375,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );
 
    /* Make the window visible on the screen */
    ShowWindow (hwnd, nCmdShow);
 
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 00))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }
 
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}
 
 
/*  This function is called by the Windows function DispatchMessage()  */
 
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int i=0;
 
    switch (message)                  /* handle the messages */
    {
        case WM_CREATE:
            sec.nLength=sizeof(SECURITY_ATTRIBUTES);
            sec.bInheritHandle=TRUE;
            sec.lpSecurityDescriptor=NULL;
 
            CreatePipe(&write_out,&write_in,&sec,0);
            CreatePipe(&read_in,&read_out,&sec,0);
 
            sprintf(command,"./adb.exe shell",NULL);
 
            si.cb=sizeof(STARTUPINFO);
            si.hStdInput=write_out;
            si.hStdOutput=read_out;
            si.dwFlags=STARTF_USESTDHANDLES;
 
            rtv=CreateProcess(NULL,
                            command,
                            NULL,
                            NULL,
                            TRUE,
                            NULL,
                            NULL,
                            NULL,
                            &si,
                            &pi);
 
            if(!rtv){
                printf("Error");
                PostQuitMessage (0);
            }
            sprintf(buffer,"sendevent /dev/input/event2 3 57 1\n");
            WriteFile(write_in,buffer,strlen(buffer),&writen,NULL);
            printf("%s",buffer);
 
 
            break;
        case WM_KEYDOWN:
            switch(wParam){
                case VK_UP:
                    y++;
                    x++;
                    sprintf(buffer,"sendevent /dev/input/event2 3 53 50\n",x);
                    WriteFile(write_in,buffer,strlen(buffer),&writen,NULL);
                    printf("%s",buffer);
                    sprintf(buffer,"sendevent /dev/input/event2 3 54 %d\n",y);
                    WriteFile(write_in,buffer,strlen(buffer),&writen,NULL);
                    printf("%s",buffer);
                    sprintf(buffer,"sendevent /dev/input/event2 3 48 2\n");
                    WriteFile(write_in,buffer,strlen(buffer),&writen,NULL);
                    printf("%s",buffer);
                    sprintf(buffer,"sendevent /dev/input/event2 3 58 5\n");
                    WriteFile(write_in,buffer,strlen(buffer),&writen,NULL);
                    printf("%s",buffer);
                    sprintf(buffer,"sendevent /dev/input/event2 0 0 0\n");
                    WriteFile(write_in,buffer,strlen(buffer),&writen,NULL);
                    printf("%s",buffer);
                    /*
                    strcpy(buffer,"sendevent /dev/input/event2 3 57 -1\n");
                    WriteFile(write_in,buffer,strlen(buffer),&writen,NULL);
                    printf("%s",buffer);
                    strcpy(buffer,"sendevent /dev/input/event2 0 0 0\n");
                    WriteFile(write_in,buffer,strlen(buffer),&writen,NULL);
                    printf("%s",buffer);
                    */
                Sleep(250);
                default :
                    printf("%d",wParam);
                    break;
            }
            /*
            for(i=0;i<MAX_LINE;i++){
                buffer[i]=0x00;
            }
            ReadFile(read_in,buffer,sizeof(buffer),&readn,NULL);
            printf("%s",buffer);
            */
            break;
        case WM_DESTROY:
            strcpy(buffer,"exit\n");
            WriteFile(write_in,buffer,strlen(buffer),&writen,NULL);
            printf("%s",buffer);
 
            CloseHandle(write_in);
            CloseHandle(write_out);
            CloseHandle(read_in);
            CloseHandle(read_out);
            CloseHandle(pi.hProcess);
 
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}
 
 
cs


Posted by JunkMam
,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
0003 002f 00000000//0번째 터치
 
0003 002f 00000001//1번째 터치
 
//sendevent 설정
sendevent /dev/input/event2 0 0 0
 
- tap
0003 0039 00003c4a
0003 0035 00000133
0003 0036 00000154
0003 0030 00000022
0003 003a 00000005
0000 0000 00000000
0003 0039 ffffffff
0000 0000 00000000
 
 
- swipe
0003 0039 00003c4c
0003 0035 0000003a
0003 0036 00000136
0003 0030 00000016
0003 003a 00000002
0000 0000 00000000
0003 0035 00000056
0003 0036 00000120
0003 0030 00000021
0000 0000 00000000
0003 0035 00000066
0003 0036 00000117
0003 003a 00000004
0000 0000 00000000
0003 0035 0000007a
0003 0036 0000010e
0000 0000 00000000
0003 0035 00000088
0003 0036 00000106
0000 0000 00000000
0003 0035 0000009a
0003 0036 000000fe
0003 003a 00000006
0000 0000 00000000
0003 0035 000000a7
0003 0036 000000f9
0003 003a 00000004
0000 0000 00000000
0003 0035 000000bf
0003 0036 000000f2
0003 003a 00000005
0000 0000 00000000
0003 0035 000000ce
0003 0036 000000ef
0003 003a 00000004
0000 0000 00000000
0003 0035 000000dc
0003 0036 000000ec
0000 0000 00000000
0003 0035 000000eb
0003 0036 000000eb
0000 0000 00000000
0003 0035 000000f9
0003 003a 00000003
0000 0000 00000000
0003 0035 0000010c
0003 0036 000000ef
0003 003a 00000004
0000 0000 00000000
0003 0035 0000011c
0003 0036 000000f5
0003 003a 00000006
0000 0000 00000000
0003 0035 0000012a
0003 0036 000000fd
0003 003a 00000005
0000 0000 00000000
0003 0035 00000136
0003 0036 00000105
0003 003a 00000004
0000 0000 00000000
0003 0035 00000140
0003 0036 0000010f
0000 0000 00000000
0003 0035 0000014a
0003 0036 0000011a
0000 0000 00000000
0003 0035 00000153
0003 0036 00000127
0000 0000 00000000
0003 0035 00000158
0003 0036 00000133
0000 0000 00000000
0003 0035 0000015d
0003 0036 00000141
0003 003a 00000005
0000 0000 00000000
0003 0035 00000162
0003 0036 00000153
0003 003a 00000004
0000 0000 00000000
0003 0035 00000163
0003 0036 00000161
0003 003a 00000005
0000 0000 00000000
0003 0035 00000164
0003 0036 00000171
0003 003a 00000004
0000 0000 00000000
0003 0035 00000163
0003 0036 0000017f
0000 0000 00000000
0003 0035 0000015e
0003 0036 00000192
0003 003a 00000003
0000 0000 00000000
0003 0035 00000154
0003 0036 000001a6
0003 003a 00000002
0000 0000 00000000
0003 0035 00000144
0003 0036 000001b5
0003 003a 00000004
0000 0000 00000000
0003 0035 0000012e
0003 0036 000001c9
0000 0000 00000000
0003 0035 00000119
0003 0036 000001d7
0000 0000 00000000
0003 0035 00000103
0003 0036 000001e2
0000 0000 00000000
0003 0035 000000e8
0003 0036 000001f1
0000 0000 00000000
0003 0035 000000d3
0003 0036 000001ff
0003 003a 00000002
0000 0000 00000000
0003 0035 000000bd
0003 0036 00000209
0003 003a 00000004
0000 0000 00000000
0003 0035 000000aa
0003 0036 0000020e
0003 003a 00000002
0000 0000 00000000
0003 0035 000000a1
0003 003a 00000004
0000 0000 00000000
0003 0035 00000090
0003 0036 0000020c
0003 0030 0000000d
0003 003a 00000001
0000 0000 00000000
0003 0039 ffffffff
0000 0000 00000000
 
 
cs


여기서 본다면, 

이벤트는 총 3형태로 입력을 받는다는걸 알 수 있다.

첫번째열인 0003과 0000에서

0003은 터치레 관련된 걸 뜻하는 것 같고,

0000은 시스템적으로 종료를 뜻하는 것 같다.

0039는 터치의 시작을 뜻하는 것인 것 같고

00003c4a와 00003c4c는 터치의 횟수이다.

002f는 터치의 갯수의 종료를 뜻하는 거라고 알 수 있을것이다.

다중 처리 방법으로 처리 할 수 있을 것이다.(ZoomIn/Out)


기본적으로


1
2
3
4
5
6
7
8
9
10
0003 0039 00003c4a // tap 시작
0003 0035 00000133 // x 혹은 y
0003 0036 00000154 // x 혹은 y
0003 0030 00000022 // Prs
0003 003a 00000005 // 
0000 0000 00000000 // 입력
0003 0039 ffffffff // 터치 종료
0000 0000 00000000 // 입력
 
 
cs


이런 형태이고, 이걸 응용하여, 값을 측정 해 낸다.

Hex값이기 때문에, 3c4a같은 건 횟수에서 꽤 많은 터치가 있었다는 뜻이 된다.

0x35는 X축 0x36 Y축의 값을 처리하게 되어있고, 0x30은 Prs의 Size 뜻이다.(면적)

0x3a는 Prs를 뜻하게 된다.

Posted by JunkMam
,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#if defined(UNICODE) && !defined(_UNICODE)
    #define _UNICODE
#elif defined(_UNICODE) && !defined(UNICODE)
    #define UNICODE
#endif
 
#include <tchar.h>
#include <windows.h>
 
#include <stdio.h>
#include <stdlib.h>
 
#define MAX_LINE 4096
 
/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
 
/*  Make the class name into a global variable  */
TCHAR szClassName[ ] = _T("ADB 연결 장치");
 
//프로세스를 위한 변수
HANDLE write_in, write_out;
HANDLE read_in, read_out;
 
SECURITY_ATTRIBUTES sec;
 
long unsigned int writen=0;
long unsigned int readn=0;
 
int rtv;
 
char command[80= {0,};
char buffer[MAX_LINE];
 
STARTUPINFO si={0,};
PROCESS_INFORMATION pi;
 
 
int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */
 
    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);
 
    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default colour as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
 
    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;
 
    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           szClassName,       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           544,                 /* The programs width */
           375,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );
 
    /* Make the window visible on the screen */
    ShowWindow (hwnd, nCmdShow);
 
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 00))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }
 
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}
 
 
/*  This function is called by the Windows function DispatchMessage()  */
 
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int i=0;
 
    switch (message)                  /* handle the messages */
    {
        case WM_CREATE:
            sec.nLength=sizeof(SECURITY_ATTRIBUTES);
            sec.bInheritHandle=TRUE;
            sec.lpSecurityDescriptor=NULL;
 
            CreatePipe(&write_out,&write_in,&sec,0);
            CreatePipe(&read_in,&read_out,&sec,0);
 
            sprintf(command,"./adb.exe shell",NULL);
 
            si.cb=sizeof(STARTUPINFO);
            si.hStdInput=write_out;
            si.hStdOutput=read_out;
            si.dwFlags=STARTF_USESTDHANDLES;
 
            rtv=CreateProcess(NULL,
                            command,
                            NULL,
                            NULL,
                            TRUE,
                            NULL,
                            NULL,
                            NULL,
                            &si,
                            &pi);
 
            if(!rtv){
                printf("Error");
                PostQuitMessage (0);
            }
 
            break;
        case WM_KEYDOWN:
            strcpy(buffer,"input keyevent 26\n");
            WriteFile(write_in,buffer,strlen(buffer),&writen,NULL);
            printf("%s",buffer);
 
            for(i=0;i<MAX_LINE;i++){
                buffer[i]=0x00;
            }
 
            ReadFile(read_in,buffer,sizeof(buffer),&readn,NULL);
            printf("%s",buffer);
            break;
        case WM_DESTROY:
            strcpy(buffer,"exit\n");
            WriteFile(write_in,buffer,strlen(buffer),&writen,NULL);
            printf("%s",buffer);
 
            CloseHandle(write_in);
            CloseHandle(write_out);
            CloseHandle(read_in);
            CloseHandle(read_out);
            CloseHandle(pi.hProcess);
 
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}
 
 
cs


윗 방법을 이용해서 Win32로 GUI을 적용할 수 있게 된다.

여기서, 키보드를 누르면 전원키를 누르는 효과를 가지게 된다.


Timer을 이용해서 ADB의 ScreenCap의 내용을 가지고 오게 할 수도 있다.

Posted by JunkMam
,

 shell에서 input을 사용하면 느끼는게 있을것인데, 그것은 바로, 처리속도의 딜레이가 존재한다.

 물론, sendevent라고 해서 Event(사용자가 행동하는 것)를 이용하여 처리한다고 해도 딜레이는 존재한다.(상대적으로 적하지만, 꼬인다는 점은 문제가 있다.)


 sendevent로 한다면, 알맞는 입력 장치랑 연결해야된다.

 그렇게 하기 위해선 해당 기기의 입력 장치가 뭐있는지 알아봐야되는데, 입력 장치를 찾아오고 해당 입력을 알아보는 명령어가 getevent이다.


 getevent만 쳐서 작동시키면, 모든 이벤트를 받아온다.(모든 이벤트가 뭘 뜻하는지 처음 출력한다.)


 getevent /dev/input/event0


 윗 방식으로 한다면, event0의 입력 값을 받아온다.

Posted by JunkMam
,

ADB로 Screencap으로 RAW파일을 만들었으면, 이제 볼줄 알아야될것이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
e0 01 00 00 20 03 00 00 01 00 00 00 8f 8f 8f ff 8f 8f 8f ff
8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff
8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff
8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff
8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff
8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff
8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff
8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff
8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff
8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff
8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff
8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff
8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff
8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff
1e 1e 1e ff 8e 8e 8e ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff
8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff
8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff
8f 8f 8f ff 8f 8f 8f ff 8f 8f 8f ff
cs


가지고 온다면, 이렇게 된다.


여기서 e0 01 00 00 는 가로축 20 03 00 00 은 세로축이된다.

01 00 00 00는 레이아웃으로 1층계열로하는데, screencap은 기본적으로 1계층으로 나온 화면만 다 가져오기 때문에 01 00 00 00 는 고정이라고 보는게 맞다.


이후에 값은 RGBA형태로 들어간다.

8f 8f 8f ff

뒤에 A인 FF는 투명도인데, screencap은 전체적인 것이기 때문에 투명도가 그냥 FF로 최댓값이다.

윗 값이 한 픽셀이기 때문에 int형 일차 배열을 e0 01 00 00 X 20 03 00 00 크기만큼 가져야된다.

여기서 int형인데, Little Endian형태로 가지는걸 알 수 있다.

Big Endian이면, 스마트폰이 아직 안나온 크기가 되니 Little Endian이라는걸 알 수 있을것이다.


윗 방법으로 값을 구해서 32Bit(Alpha 값이 필요 없기 때문에 3Byte(24bit) 색을 사용하면된다.)색을 가지고 와서 쓰면 된다.

Posted by JunkMam
,