SDK源码分析 15

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SDK源码分析 15相关的知识,希望对你有一定的参考价值。

  1 #include <windows.h>
  2 #define ID_LIST     1
  3 #define ID_TEXT     2
  4 #define MAXREAD     8192
  5 #define DIRATTR     (DDL_READWRITE|DDL_READONLY|DDL_HIDDEN|DDL_SYSTEM|  6                      DDL_DIRECTORY|DDL_ARCHIVE|DDL_DRIVES)
  7 #define DTFLAGS     (DT_WORDBREAK|DT_EXPANDTABS|DT_NOCLIP|DT_NOPREFIX)
  8 
  9 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 10 LRESULT CALLBACK ListProc(HWND, UINT, WPARAM, LPARAM);
 11 WNDPROC OldList;
 12 
 13 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int nCmdShow)
 14 {
 15     WNDCLASS wndclass;
 16     HWND hWnd;
 17     MSG msg;
 18     TCHAR szClassName[] = TEXT("MyClass"), szWindowsName[] = TEXT("MyWindows");
 19 
 20     wndclass.cbClsExtra = 0;
 21     wndclass.cbWndExtra = 0;
 22     wndclass.hbrBackground = CreateSolidBrush(GetSysColor(COLOR_BTNFACE));//(HBRUSH)GetStockObject(WHITE_BRUSH);
 23     wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
 24     wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
 25     wndclass.hInstance = hInstance;
 26     wndclass.lpfnWndProc = WndProc;
 27     wndclass.lpszClassName = szClassName;
 28     wndclass.lpszMenuName = NULL;
 29     wndclass.style = CS_VREDRAW | CS_HREDRAW;
 30 
 31     if (!RegisterClass(&wndclass))
 32     {
 33         MessageBox(hWnd, TEXT("The Application on Windows NT!"), TEXT("ERROR~"), MB_OK);
 34     }
 35 
 36     hWnd = CreateWindow(szClassName,
 37         szWindowsName,
 38         WS_OVERLAPPEDWINDOW,
 39         CW_USEDEFAULT,
 40         CW_USEDEFAULT,
 41         CW_USEDEFAULT,
 42         CW_USEDEFAULT,
 43         NULL, NULL, hInstance, NULL);
 44     ShowWindow(hWnd, nCmdShow);
 45     UpdateWindow(hWnd);
 46 
 47     while (GetMessage(&msg, NULL, NULL, NULL))
 48     {
 49         TranslateMessage(&msg);
 50         DispatchMessage(&msg);
 51     }
 52     return msg.wParam;
 53 }
 54 
 55 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
 56 {
 57     static BOOL          bValidFile;
 58     static BYTE          buffer[MAXREAD];
 59     static HWND          hWndList, hWndText;
 60     static RECT          rect;
 61     static TCHAR         szFile[MAX_PATH + 1];
 62     HANDLE               hFile;
 63     int                  i, cxChar, cyChar;
 64     TCHAR                szBuffer[MAX_PATH + 1];
 65     PAINTSTRUCT          ps;
 66     HDC                  hdc;
 67 
 68     switch (msg)
 69     {
 70     case WM_CREATE:
 71         cxChar = LOWORD(GetDialogBaseUnits());
 72         cyChar = HIWORD(GetDialogBaseUnits());
 73 
 74         rect.left = 20 * cxChar;//矩形位置 左边 =20*cxchar
 75         rect.top = 3 * cyChar;//矩形位置 顶边 =3*cyChar
 76 
 77         //创建 一个列表框
 78         hWndList = CreateWindow(TEXT("listbox"), NULL,
 79             WS_CHILDWINDOW | WS_VISIBLE | LBS_STANDARD,
 80             cxChar, cyChar * 3,
 81             cxChar * 13 + GetSystemMetrics(SM_CXVSCROLL),
 82             cyChar * 10,
 83             hWnd, (HMENU)ID_LIST,
 84             (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), NULL);
 85             
 86         //获取当前目录 保存到szBuffer
 87         GetCurrentDirectory(MAX_PATH + 1, szBuffer);
 88         
 89         //创建一个 静态文本框 左对齐
 90         hWndText = CreateWindow(TEXT("static"), szBuffer,
 91             WS_CHILDWINDOW | WS_VISIBLE | SS_LEFT,
 92             cxChar, cyChar, cxChar*MAX_PATH, cyChar,
 93             hWnd, (HMENU)ID_TEXT, (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), NULL);
 94 
 95         //窗口子类化 列表框 返回旧 过程
 96         OldList = (WNDPROC)SetWindowLong(hWndList, GWL_WNDPROC, (LPARAM)ListProc);
 97         
 98         //发送消息给列表框 
 99         SendMessage(hWndList, LB_DIR, DIRATTR, (LPARAM)TEXT("*.*"));
100         return 0;
101     case WM_SIZE:
102         rect.bottom = LOWORD(lParam);
103         rect.right = HIWORD(lParam);
104         //设置矩形范围
105         return 0;
106     case WM_COMMAND:
107         if (LOWORD(wParam) == ID_LIST && HIWORD(wParam) == LBN_DBLCLK)//如果是列表框消息 和 列表框双击
108         {
109             if (LB_ERR == (i = SendMessage(hWndList, LB_GETCURSEL, 0, 0)))//如果出错就跳出
110                 break;
111             SendMessage(hWndList, LB_GETTEXT, i, (LPARAM)szBuffer);//发送 获取文本的消息 保存到szBuffer
112 
113 
114             //打开文件名:szBuffer 只读 只读请求 空 文件必须要存在  如果返回INVALID_HANDLE_VALUE 代表出错
115             if (INVALID_HANDLE_VALUE != (hFile = CreateFile(szBuffer,
116                 GENERIC_READ, FILE_SHARE_READ, NULL,
117                 OPEN_EXISTING, 0, NULL)))
118             {
119                 CloseHandle(hFile);//关闭文件句柄
120                 bValidFile = TRUE;//标记真
121                 lstrcpy(szFile, szBuffer);//字符串拷贝 到szFile
122                 GetCurrentDirectory(MAX_PATH + 1, szBuffer);//测试 文件是否子文件
123                 if (szBuffer[lstrlen(szBuffer) - 1] != \\)//如果最后的内容不是 ‘\\‘
124                 {
125                     lstrcat(szBuffer, TEXT("\\")); //字符串szBuffer加入 ‘\\‘
126                 }
127                 SetWindowText(hWndText, lstrcat(szBuffer, szFile));//设置静态文本框内容 
128             }
129             else
130             {
131                 bValidFile = FALSE;//标记关闭
132                 szBuffer[lstrlen(szBuffer) - 1] = \0;//加入结束符号
133                 if (!SetCurrentDirectory(szBuffer + 1))//改变当前目录 取反
134                 {
135                     szBuffer[3] = :;//字符串加入
136                     szBuffer[4] = \0;//字符串加入
137                     SetCurrentDirectory(szBuffer + 2);//更改新的的 盘符
138                 }
139                 GetCurrentDirectory(MAX_PATH + 1, szBuffer);//获取当前内容
140                 SetWindowText(hWndText, szBuffer);//设置文本
141                 SendMessage(hWndList, LB_RESETCONTENT, 0, 0);
142                 SendMessage(hWndList, LB_DIR, DIRATTR, (LPARAM)TEXT("*.*"));
143             }
144             InvalidateRect(hWnd, NULL, TRUE);//立即重绘
145         }
146         return 0;
147     case WM_PAINT:
148         if (!bValidFile)//如果没在读取
149             break;
150         if (INVALID_HANDLE_VALUE == (hFile = CreateFile(szFile,
151             GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL)))//打开文件 失败
152         {
153             bValidFile = FALSE;//标记关闭 跳出
154             break;
155         }
156         ReadFile(hFile, buffer, MAXREAD, (LPDWORD)&i, NULL);//读取文件内容 
157         CloseHandle(hFile);//关闭文件
158 
159         hdc = BeginPaint(hWnd, &ps);
160         
161         SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT));
162         SetTextColor(hdc, GetSysColor(COLOR_BTNTEXT));
163         SetBkColor(hdc, GetSysColor(COLOR_BTNFACE));
164         DrawTextA(hdc, (LPCSTR)buffer, i, &rect, DTFLAGS);//画出文本
165 
166         EndPaint(hWnd, &ps);
167         return 0;
168     case WM_DESTROY:
169         PostQuitMessage(0);
170         return 0;
171     }
172 
173     return DefWindowProc(hWnd, msg, wParam, lParam);
174 }
175 
176 LRESULT CALLBACK ListProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
177 {
178     if(msg==WM_KEYDOWN && wParam ==VK_RETURN)
179     { 
180         SendMessage(GetParent(hWnd), WM_COMMAND, MAKELONG(1, LBN_DBLCLK), (LPARAM)hWnd);
181     }
182     return CallWindowProc(OldList, hWnd, msg, wParam, lParam);
183 }

 

以上是关于SDK源码分析 15的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )(代码片段

Android 事件分发事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )(代码片段

Weex Android SDK源码分析之界面渲染(下)

Weex Android SDK源码分析之Module(navigator)

Weex Android SDK源码分析之Module(modal)

Weex Android SDK源码分析之Module(animation)