[乱]sdk的学习笔记(二)

             在凌晨对mfc的分析中逐渐的了解了脉络,也逐渐清晰了windows程序的运行机制。也感觉到以前的概念根本一丁点也不能灌输进来进行参考,这是一个几乎全新的领域(对于我),从昨天的小笔记开始思考,microsoft给我们的工具是否正在一步一步让程序员走向傻瓜化?像照相机,现在不到十岁就知道,按下一个按钮就可以拍照了……像我之前,就知道用C#写网站写程序,但是,这都是进行封装过的,用起来顺手但是却不知道原理何在,很容易被他们蒙蔽了头脑,当根深蒂固的时候,想改变以往观念已经很难了,所以不能浪费时间,那东西用来入门可以,要求产量的时候可以,用来练级几乎是不可能的事情。所以开始研究一些源码。今天从IESpy小工具入手,它是一个开源的程序,慢慢分析,自己加注释。对,今天是纯粹的api。

  1. 原来,可以在直接绘制窗体资源,然后…就不用为手写界面而浪费时间了
    1. int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
    2. {
    3.    ghInstance = hInstance;
    4.  
    5.    DialogBox( hInstance,       //DialogBox()是从资源创建窗体的函数
    6.    MAKEINTRESOURCE( IDD_DIALOG1 )//MAKEINTRESOURCE 宏 后面跟窗体资源标识
    7.    NULL,
    8.    (DLGPROC)MainDlgProc );     //消息处理函数。
    9.    return 1;
    10. }
  2. 一下为消息循环了,小图标更换
    1. static HCURSOR hDragCursor = NULL;        //光标句柄
    2.    static HCURSOR hRegularCursor = NULL;
    3.    switch ( message )
    4.    {
    5.    case WM_INITDIALOG:    //对话框初始化,msdn的解释是对话框出现之前的消息
    6.  {
    7.          hwndMain = hDlg;
    8.  
    9.          hDragCursor = LoadCursor( ghInstance, MAKEINTRESOURCE(IDC_CURSOR1) )//初始化滑鼠拖拽时样式函数
    10.          hRegularCursor = LoadCursor( NULL, IDC_ARROW );    //初始化常规光标
    11.  
    12. #ifdef _WIN64 //如果是64位机器?
    13.          SetClassLong( hwndMain, GCLP_HICON, ( long ) LoadIcon( GetModuleHandle( NULL ), MAKEINTRESOURCE( IDI_1MAIN ) ) );    //SetClassLong()大概是设置的东西。整句是小图标更换成资源的图标.  GetModuleHandle返回一个特定句柄模型指针? If this parameter is NULL, GetModuleHandle returns a handle to the file used to create the calling process.
    14. #else
    15.          SetClassLong( hwndMain, GCL_HICON, ( long ) LoadIcon( GetModuleHandle( NULL ), MAKEINTRESOURCE( IDI_1MAIN ) ) );        //LoadIcon取得特定鼠标资源。
    16. #endif
    17.         
    18.          return 1;
    19.       }
  3. 获取控件咨询
    1. case WM_CTLCOLORSTATIC: //控件drawn后,返回给父窗口。wParam参数为控件的dc,lParam参数为静态控件句柄
    2.       {
    3.          if ( ( HWND ) lParam == GetDlgItem( hwndMain, IDC_CLASSNAME ) )     //GetDlgItem返回在资源窗体中的控件标识...  总句解释为是不是叫IDC_CLASSNAME的控件触发了此消息
    4.          {           
    5.             if (lstrcmp("Internet Explorer_Server", lpClassName) == 0) //比较两者大小.如果一样.
    6.                return FormatControl( ( HWND ) lParam, ( HDC ) wParam, FW_BOLD, 15, _TEXT_BLACK_, "MS Shell Dlg", FALSE, TRANSPARENT, NULL );    //稍后解释
    7.             else
    8.                return FormatControl( ( HWND ) lParam, ( HDC ) wParam, FW_BOLD, 15, _TEXT_BLACK_ , "MS Shell Dlg", FALSE, TRANSPARENT, NULL );
    9.          }
    10.          if ( ( HWND ) lParam == GetDlgItem( hwndMain, IDC_ABOUT ) ) 
    11.             return FormatControl( ( HWND ) lParam, ( HDC ) wParam, FW_NORMAL, 15, _TEXT_BLUE_ , "MS Shell Dlg", TRUE, TRANSPARENT, WHITE_BRUSH );
    12.  
    13.          return 1;
    14.       }
  4. 投递自定消息
    1. case WM_RBUTTONDOWN:      //右击消息
    2.       {
    3.          PostMessage( hwndMain, WM_NCLBUTTONDOWN, HTCAPTION, 0 );     //给hwndMain投递消息。
    4.          return 1;
    5.       }
    1. case WM_LBUTTONDOWN:      //左击消息
    2.       {
    3.          POINT pt = { LOWORD( lParam ), HIWORD( lParam )}; //获得鼠标坐标
    4.         
    5.          HWND  hChild = ChildWindowFromPoint( hwndMain, pt ); //从point中得到子窗口句柄..
    6.  
    7.          if ( hChild != GetDlgItem( hwndMain, IDC_DRAGICON ) )      //如果单击的不是指定的控件
    8.          {
    9.             PostMessage( hwndMain, WM_NCLBUTTONDOWN, HTCAPTION, 0 );     //做默认消息
    10.             return 1;
    11.          }
    12.         //否则
    13.          SetCapture(hwndMain);         //设置捕获
    14.          SetCursor( hDragCursor );     //设置鼠标
    15.  
    16.          isDragging= TRUE;      //设置拖拽标识
    17.          return 1;
    18.       }
    1. case WM_LBUTTONUP:     //左键松开
    2.       {
    3.          POINT  pt;
    4.  
    5.          isDragging= FALSE;      //没有拖拽了
    6.         
    7.          SetCursor( hRegularCursor );    //恢复常规图标
    8.          ReleaseCapture();    //释放捕获
    9.         
    10.          pt.x = LOWORD( lParam );
    11.          pt.y = HIWORD( lParam );
    12.         
    13.          ClientToScreen( hwndMain, ( LPPOINT ) & pt )//转换相对坐标到相对屏幕坐标
    14.          hTarget = WindowFromPoint(pt); //从pt获得外界程序句柄
    15.         
    16.          if (hTarget == hwndMain || !hTarget) return TRUE;
    17.          GetClassName(hTarget, lpClassName, 255 );    //获得CLASSNAME
    18.  
    19.          SetDlgItemText( hwndMain, IDC_CLASSNAME, lstrlen(lpClassName) ? lpClassName: "( none )");    //在控件写入文本
    20.  
    21.          if (lstrcmp("Internet Explorer_Server", lpClassName) == 0)
    22.          {
    23.             hIETarget = hTarget;
    24.             StopFlashing(); //自定的后续解释
    25.             GrabSource();
    26.          }
    27.          else
    28.          {
    29.             StopFlashing();
    30.             MessageBox( NULL, "The target window you have specified is not an Internet Explorer control.", "Invalid Window", MB_TASKMODAL );
    31.             SetDlgItemText( hwndMain, IDC_CLASSNAME, " ");
    32.            
    33.          }
    34.         
    35.          return TRUE;
    36.       }
    1. case WM_MOUSEMOVE:        //鼠标移动时
    2.       {
    3.          if (GetCapture()) //如果鼠标捕获到了
    4.          {
    5.             POINT  pt;
    6.             HWND   hTarget;
    7.             char   lpClassName[255]="";
    8.  
    9.             pt.x = LOWORD( lParam );
    10.             pt.y = HIWORD( lParam );
    11.         
    12.             ClientToScreen( hwndMain, ( LPPOINT ) & pt );
    13.             hTarget = WindowFromPoint(pt);
    14.         
    15.             if (!hTarget || hTarget == hwndMain) 
    16.             {
    17.                if (isDragging)
    18.                   SetCursor( hDragCursor );      //设置拖拽时
    19.                else
    20.                {
    21.                   SetCursor( hRegularCursor );
    22.                   ReleaseCapture();      //释放捕获
    23.                } 
    24.             }
    25.             else
    26.             {
    27.                HWND hwndChild = TopChildWindowFromPoint(hTarget, pt);
    28.  
    29.                while (hwndChild != NULL && hwndChild != hTarget)
    30.                {
    31.                   hTarget = TopSiblingWindowFromPoint(hwndChild, pt);
    32.                   hwndChild = TopChildWindowFromPoint(hTarget, pt);
    33.                }
    34.               
    35.                DWORD dwStyles = GetWindowLong(hTarget, GWL_STYLE)//获得额外句柄信息..
    36.                DWORD dwExStyles = GetWindowLong(hTarget, GWL_EXSTYLE);
    37.                if ((dwStyles & WS_CHILD) && !(dwExStyles & WS_EX_MDICHILD))
    38.                   hTarget = TopSiblingWindowFromPoint(hTarget, pt);
    39.  
    40.  
    41.                if (hTarget != hTargetLast)
    42.                {
    43.                   StopFlashing();
    44.                   hTargetLast = hTarget;
    45.                   StartFlashing(hTarget);
    46.                }
    47.  
    48.                GetClassName(hTarget, lpClassName, 255 );
    49.                SetDlgItemText( hwndMain, IDC_CLASSNAME, lpClassName);
    50.             }
    51.          }
    52.          return TRUE;
    53.       }
    1. case WM_QUIT:      
    2.    case WM_CLOSE:
    3.       {
    4.          ExitProcess (1);     //退出所有句柄..
    5.          return TRUE;
    6.       }
    7.      
    8.    case WM_COMMAND:
    9.       {
    10.          switch ( LOWORD( wParam ) )
    11.          {
    12.          case IDOK:
    13.             {
    14.                ExitProcess (1);
    15.                return 1;
    16.             }
    17.          case IDC_ABOUT:
    18.             {
    19.                MessageBox( hwndMain,
    20.                   "IESpy v1.1\n\n"
    21.                   "Reveals the HTML source code behind embedded Internet Explorer\n"
    22.                   "controls. Requires Windows 98/ME/2000. IESpy is free and open source.\n\n"
    23.                   "Written by Andrew Fawcett (afawcett@u.washington.edu)\n"
    24.                   "http://www.disoriented.com/labs/\n",
    25.                   "About IESpy", MB_APPLMODAL);
    26.             }
    27.          }
    28.       }

今天分析到此为止…明儿继续.

Tags: , , ,

One Response to “[乱]sdk的学习笔记(二)”

  1. 海洋 说:

    搞了两天问题被你一个(POINT pt = { LOWORD( lParam ), HIWORD( lParam )};)搞定了,
    非常感谢!!!交个朋友杂样?有QQ号就发到我邮箱,我加你。

Leave a Reply