         

     11 

     Win32-cpeny, Microsoft      
       ,   
  .       
,      .   
      16- Windows. 
       , Microsoft     ,  
    16- Windows. ,    
  Win32-cHcreMa   ,  16-.   
      Win32    
    .       
   . 

     

    -,    -   
Win32  16 Windows.      
 ,       
:        
,        .  
     ,   . 
       ,        
- ,    ,   
.     -   
  ,       
,     .   
   :  ,   . 
       ,    16- 
Windows    ,      
. ,         
   Windows. ,  ,   
    .       
 , 16- Windows    
    . 
     ,   ,     . 
              
.    SetTimer   , 
    WM_TIMER    ,    
  .      : 

    315 

    316 .______________________________Windows   

          16- Windows .  
 ,   ,     ,  
   ,  ? 
       ,       
 .       
        ,  
  ,    , 
      . . 
        ,   ,    
,   .   ,    
       .  
     ,     
   . ,      , 
            
   ! 
      WM_TIMER     . 
,     1 ,  WM_TIMER  60 
     ,     386- 
    25     Pentium-90. ,  
          . 
       16-      
        PeekMessage.  
,   16- Windows:     ,   
   ,     . 
      :     ,   
    .        
  .     : -,  
PeekMessage ,  ,     , 
 -,        
. ,         
 ,        DDE-.  
         . 
         ,     
,          
.           
16- Windows   ,    .  ,  
- -       Windows,  
   -:     ,  
    .   . ,  ! 
     Win32  (  )    
.    Windows NT  Windows 95   , 
     .   
     ,        
     . 

        

     16- Windows    .  , 
        
  ,    -     
.  ,   

    ____________ 11.      317 

         ,    
  (task switching), . .,    
    ,    
  . ,     
    .     
 , ,  -      ,  
  ,    ,   
 ,  , , . 
     , 16- Windows      . 
       .  ,   
,   16- Windows .   
  (   ),  ( )  
   ,    . 
          
,         . 
     Win32     ,    16- Windows, 
       :  (processes)  
 (threads). 
         3,     
. ,   1  Notepad  2   
Calculator,    3 .    (.  4) 
 ,    ,   .  
       ,  . 
,    Win32-poee,   
- ,          
         
 ;         WinMain.  
  (   WinMain)    ,  . 
        1 ;    
  ,    .  ,   
    .     , 
       .   
      . 
               
  .        
 ( ,     ).  
          
       
(preemptive multitasking). 
           .    
  :   ,   
 ,  .      , 
   ;     ,  
    . 
     ,  ,   
,    . ,    
  ,   .       
  .   GDI (, ,  
)     .    User 
(, ,  ,    )  
 ,      ,   
    .    User     
 (hooks)   ,   . 
         ,  ,   
   ,    .    7    
  

    318 ______________________________Windows   

      ,       .  
    ,     
  ,      . ,  
      10. 
        ,  \32-   
       16- Windows. 
 , ,     ,    
      -     
    .   , ,   
    ,  ,    , 
    ,   .      
    .  16- Windows  
 - ,     
 . 

         

     ,  Win32-poe,  
 .  16- Windows   .   
     ,    
,    ,  . 
         .  
  16- Windows.     . 
     Win32       ,    
    ,   .   
   ,      
  - .    
    ,  -   . 
    ,    (sent)  
 (posted)   . 

        Win32 

       ,     Win32    
  .       
  ,      . ,   
         .  
,      ,   
    (keyboard focus),  
,    (mouse capture)  . . 
            THREADINFO  
    .    ,  
     ,     , 
  . , THREADINFO    
() ,    
  (posted-message queue),     
(sent-message queue),    (reply-message queue), 
   (virtualized input queue)    (wake 
flags);      ,    
    .  . 11-1   
 THREADINFO   . 
            THREADINFO. 

     11.      319 
    
    THREADINFO	- MSG () |- MSG () 1 
        
       	MSG () ]- MSG () ]- MSG () ] 
       	- MSG () 1- MSG 
() ] 
       	MSG () I MSG () 1 
     	DINFO	- MSG () 1- MSG () ) 
        
    THREA 
        
       	MSG () 1- MSG () J- MSG () j 
       	- MSG () |- MSG 
() \ 
       	MSG () |- MSG () 1 
     	) \- MSG ();!! 
        
    THREADINFO	- MSG ( 
        
       	MSG () j- MSG () )- MSG () 1 
       	- MSG () 1- MSG 
() 1 
       	MSG () |- MSG () 1 
      
        
    
    . 11-1.       THREADINFO 


    320 _____________________________Windows   


          

     Win32      ,    
     .       
  User-  GDI-,      
.       
 :  ,  ,   THREADINFO. 
 ,     THREADINFO  ,    
  - User-  GDI-. 
           ,     
 .    10       
CreateWindow (User-),        10. 
       PostMessage: 

    BOOL PostMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM IParam): 

        ,  ,   
 ,   hWnd,      
  .'   PostMessage    
,     ;     , 
     .     
,       .  ,  
,   ,   ,      
 . 
              
PostThreadMessage: 

    BOOL PostThreadMessage(DWORD idThread, UINT Msg, WPARAM wParam, LPARAM IParam); 

     16- Windows      ,   
   ,   .  
     8 .     
 SetMessageQueue.  Win32 API    ,     
 ,            
  .  Win32       
.     ,     
 MSG.         
  .   THREADINFO     
   ,      . 
    ,  PostMessage,   ,     
   .  16- Windows  PostMessage 
 FALSE,   .   Win32,    
,    . 
        , idThread.   
  ,  hWnd  MSG   NULL. 
  ,    -   
     ,       , 
    
    1.    ,     GetWindowThreadProcessId: 

    DWORD GetWindowThreadProcessId(HWND hWnd LPDWord IpdwProcessId) 

           
 hWnd.     DWORD   IpdwProcessId^ 
      ,  
  .      ,    
 NULL. 

    ______________ 11.      321 

     GetMessage ( PeekMessage)     hWnd  NULL , 
    ,     msg 
 MSG.   ,     - 
, DispatchMessage  ,       . 
      PostMessage,  PostThreadMessage    
,        .  - 
    ,   . 

     PostThreadMessage  PostAppMessage  16- Windows. 


       

            

    SendMessage:                                        ' "" 
    LRESULT SendMessage(HWND hwnd, UINT Msg, WPARAM wPar-am, LPARAM IParam): 

             
 SendMessage  .  ,     
  ,    ,  PostMessage 
win PostThreadMessage.       , , 
 SendMessage, ,    . 
       SendMessage    ,   
,     :    
   .  ,   
  SendMessage 32- ,     
   . 
        ,   , , 
  SendMessage,  .2 Win32 , 
    ,  . ,  
 SendMessage    ,     
, ,  ,         
        ,    
        .  
,   ,     
.  ,       , 
  ,     . 
    -,       
-,         
QS_SENDMESSAGE (   ). -,  -   
        (  GetMessage, 
PeekMessage  WaitMessage),        
       .   
-  ,   ,    
 QS_SENDMESSAGE, ,  ,    
>_ ,    .    
    . ,   
            
      . 
    2.      ,      . 

    322 _____________________________Windows   

    ,    ,      
         .  
  ,  QS_SENDMESSAGE .  - 
 , ,    SendMessage, 
,       .  
  ,   ,  
     -.   
       .   
     SendMessage.    
-     . 
        SendMessage,    
.  -   :     
 ,   () ,    
  ,  ,    GetMessage, 
PeekMessage  WaitMessage. 
     \32-     
 ,    . ,  ,  
 ,  , -      . 
    ,  SendMessage?   
-  ?   ,      
 ?   ! 
            
\32-,      SendMessageTimeout. 
    LRESULT SendMessageTlmeout(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM 
IParam, UINT fuFlags, UINT uTimeout, LPDWORD IpdwResult): 
    SendMessageTimeout    ,    
         .  4  
   SendMessage.   fuFlags   
 SMTO_NORMAL, SMTO_ABORTIFHUNG, SMTO_BLOCK   
SMTO_ABORTIFHUNG  SMTO_BLOCK. 
     SMTO_ABORTIFHUNG ,  SendMessageTimeout  , 
   -3, ,  ,   .  
SMTO_BLOCK       
    SendMessageTimeout.  SMTO_NORMAL   
WINUSER.H  0;  ,     . 
      ,       
        . 
 SMTO_BLOCK   .  ,   
,     ,    
  .       
    . ,     
 ,      ,      
  ,   .      ~'"" 
     uTimeout     ( ),   
     .     
 TRUE,      ,   
 IpdwResult. 
    ,       WINUSER.H .  
         BOOL, 
   LRESULT       . 
   ,   SendMessageTimeout  FALSE, 
          
 . 

    3.     ,    
     5 . 

    ____________ 11.      323 

             
GetLastError.    (ERROR_SUCCESS),     
  .      , GetLastError 
  1400 (ERROR_INVALID_WINDOW.HANDLE). 
        SendMessageTimeout    , 
  ,     , 
    IpdwResult.  ,   
 SendMessageTimeout,   ,     
,       . ' 
         ,   
  : 
    BOOL SendMessageCallback(HWND hwnd. UINT uMsg, WPARAM wParam, LPARAM 
IParam, SENDASYNCPROC IpResultCallBack, DWORD dwData); 
       4     SendMessage.  
   SendMessageCallback     
   -      
 (. . ) .   , 
-        
  .       ,  
  ;      : 

    VOID CALLBACK ResultCallBack(HWND hwnd, UINT uMsg, DWORD dwData, 
    LRESULT IResult); 

          SendMessageCallback  
 IpResultCallBack.    ResultCallBack    
   ,   ,  
   .  dwData  ResultCallBack  
 ,  SendMessageCallback   . 
(   ,   ,     
ResultCallBack.)    ResultCallBack   
 ,    . 
     SendMessageCallback,    , 
  , ResultCallBack    
   ,   .  - 
       -. 
     -    GetMessage, 
PeekMessage, WaitMessage     SendMessage*,  
          
 ResultCallback. 
        SendMessageCallback.  Win32  
,        
(overlapped windows)  ;    ,    SendMessage 
   hwnd " ( HWND_BROADCAST (  -1).  
  ,      
,       LRESULT. , 
 SendMessageCallback,     
     .   
SendMessageCallback         
  . 
     SendMessageCallback     , 
  ,     , 
      ResultCallBack.    
ResultCallback    ,    SendMessageCallback. 

    324 _____________________________Windows   

     ,     : 

    BOOL SendNotlfyMessage(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM IParam): 

          -,  
    .     
PostMessage, ?    SendNotifyMessage  PostMessage   . 
    -,  SendNotifyMessage   ,  
 ,       
 ,      .  , 
,      SendNotifyMessage,  
   ,   PostMessage. 
    -,    ,   , 
SendNotifyMessage    ,   SendMessage, . .  
     . 
          , . . 
         -   
,      . , WM_ACTIVATE, WM_DESTROY, 
WM_ENABLE, WM_SIZE, WM_SETFOCUS, WM_MOVE       
,     ,    . 
        ,  
    .     
  WM_CREATE    ,     
.    -1,   . 
    , ,  ,     : 

    BOOL ReplyMessage(LRESULT IResult); 

          .      
 Send*         
, ReplyMessage  ,   . 
 ,     ,        
          
      .  
 ,     . 
    ,  ReplyMessage,     
  IResult.   ReplyMessage  
- ,  ,   , 
  .         
  .  ,  ,    
 ,     . 
    : ReplyMessage     ,  
,    ,      Send*. 
,      ,    
 SendMessage       Send*    
 ,       ReplyMessage. 
       ,   ReplyMessage   , 
   ,    .     
,  ReplyMessage: TRUE     
 FAESE        . 
      ,      
,  InSendMessage: 

    BOOL InSendMessage(VOID): 

           ,     
.   ,    TRUE,   
  ,  FALSE     
.      . 

    ______________ 11.      325 

      TRUE,      
,  FALSE      (  
).    InSendMessage  ReplyMessage . 

      

       GetMessage  WaitMessage     
     ,     ,  
      .      
    ,    
, ,        
  .         
  ,          
.   ,        
 . 
              GetQueueStatus: 

    DWORD GetQueueStatus(UINT fuFlags); 

     fuFlags     ,   
 OR;       (wake 
bits).         : 

                      

    QSJCEY            WMJCEYUP, WM_KEYDOWN, WM_SYSKEYUP  WM_SYSKEYDOWN 
    QS_MOUSE         To ,  QS_MOUSEMOVE ! QS_MOUSEBUTTON 
    QS_MOUSEMOVE    WM_MOUSEMOVE 
    QS_MOUSEBUTTON   WM_?BUTTON*1 
    QS_PAINT           WM_PAINT 
    QS_POSTMESSAGE      (    ) 
    QS_SENDMESSAGE     ,    ( 
 ) 
    QS_TIMER          WM_TIMER 
    QS_HOTKEY        WM_HOTKEY 
    QSJNPUT          To ,  QS_MOUSE ! QS_KEY 
    QS_ALLEVENTS      To ,  QSJNPUT : QS_POSTMESSAGE ! QS_TIMER ! 
    QS_PAINT ! QS_HOTKEY2 
    QS_ALLINPUT       To ,  QS_ALLEVENTS ! QS_SENDMESSAGE 

    1.   (?)   L,   R,   ()  DOWN, UP 
 DBLCLK. 
    2.  QS_SENDMESSAGE    QS_ALLEVENTS,   
    . 
      GetQueueStatus_napSiMeip fuFlags  ,  
      .    
QS_*    OR,    . 
     ,  . 
       , 
  . ,  : 

    BOOL fPaintMsgWaiting = HIWORD(GetQueueStatus(QS_TIMER)) & QS_PAINT; 

     fPaintMsgWaiting   FALSE     
  WM_PAINT,    QS_PAINT     . 

    326 _____________________________Windows   

          ,   
,        GetQueueStatus, 
GetMessage  PeekMessage. 
          .  
QS_MOUSEMOVE ,       
WM_MOUSEMOVE.  GetMessage  PeekMessage (  PM_REMOVE)  
  WM_MOUSEMOVE,       
,         WM_MOUSEMOVE. 
 QS_KEY, QS_MOUSEBUTTON  QS_HOTKEY    
  . 
     QS_PAINT  .  ,   , 
  ,  ,   
.  ,   ,   , 
  (    ValidateRect, 
ValidateRegion  BeginPaint),  QS_PAINT .   : 
  ,      , 
 .  GetMessage  PeekMessage    
  . 
     QS_POSTMESSAGE ,      
    .      
,      .   
        . 
     QS_TIMER     ( 
).    GetMessage  PeekMessage   WM_TIMER, 
      ,     . 
     QS_SENDMESSAGE ,       
,   .      
     ,    
,    ,  .    
 QS_SENDMESSAGE,       .    
      . 
       ()     QS_QUIT.  
    PostQuitMessage.  WM_QUIT   
    .  ,  GetQueueStatus   
  . 
       GetMessage  PeekMessage,   
    ,     (. 11-2): 
    1.   QS_SENDMESSAGE ,    
  . GetMessage  PeekMessage  
         ,  
   ;      
 . 
    2.        - , 
GetMessage  PeekMessage     MSG   
.    (  )    
   DispatchMessage,  ^ 
 . 
    3.    QS_QUIT, GetMessage  PeekMessage  
 WM_QUIT    . 
    4.        - , 
GetMessage  PeekMessage    . 
    5.    QS_PAINT, GetMessage  PeekMessage  
 WM_PAINT   . 
    6.    QS_TIMER, GetMessage  PeekMessage  
 WMJTIMER. 



                 327 ??????




    328 ______________________________Windows   

         ,       . 
,    Microsoft,   ,  
   ,     (  
 )  ,    .   
,     ,     
  .     
,      . 
    ,       ,   
 WM_LBUTTONDOWN,  3    . 
  3       
,     ,     
,  .      
     . 
            
TranslateMessage, ,         
WM_KEYDOWN  WM_SYSKEYDOWN.  ,  ,    
      .   
, TranslateMessage  PostMessage,     
  WM_CHAR  WM_SYSCHAR.    GetMessage 
      ,     
,     .   WM_CHAR,  
WM_SYSCHAR.   GetMessage   ,   ,  
   .     ,   
  WM_(SYS)KEYUP;    . 
       ,   ,   
  : 

    WM_KEYDOWN 
    WM_KEYUP 

           ( 
 ,        
   ): 

    WM_KEYDOWN 
    WM_CHAR 
    WM_KEYUP 

        ,   ,     
  GetMessage  PeekMessage.    
, ,        , 
  QS_QUIT. :   ,   
 PostQuitMessage.  PostQuitMessage    ,   
 PostMessage,          
       .    
PostQuitMessage    ,   WM_QUIT  
 ?     . 
    -,  16- Windows        8 
.          
 WM_QUIT,   ,     
.   ,   WM_QUIT    
,    . ,  Win32   , 
    Win32    ,  
 .     ,     
     _,_,    
. ,       : 

    _ 11.      329 


    case WM_CLOSE: 
    PostQuitMessage(O); 
    PostMessage(hwnd. WM_USER, 0, 0); 

     WM_USER     WM_QUIT,  WM_USER  
    PostQuitMessage. 
         : WM_PAINT  WM_TIMER.  WM_PAINT 
 ,         .  
     ,    
,      .  
WM_PAINT    ,    . , 
    - ,   , 
   -,   Enter        , 
    .    ,   
,       ,     
 WM_PAINT.      Enter,    
 ,    ,     
  WM_PAINT. 
     WM_TIMER  ,  WM_PAINT.  , ,  
    Clock.      
 ,    WM_TIMER.  :  
WM_TIMER   WM_PAiNT, a Clock   ,   
 ,   GetMessage   WM_PAINT. 
 Clock            
  ,    ;      
   WM_PAINT. 
     GetMessage  PeekMessage      
 .  ,        
 ,    ,     
  . 

        

      ,  Win32       
,        .  ,  
,             
  .        
 16- Windows,    Win32.    :     
Win32   . 
       -  , ,   , 
  ,    (.  8).   
,      ,   
    .  ,   
-     .      
  (  .  10).      
  .      . 
              
IParam. ,  WM_SETTEXT  IParam    
 (    ),     . 
  : 
    SendMessage(FindWindow(NULL, "Calculator"), WM_SETTEXT, 0, (LPARAM) "A 
Test Caption"): 
        :     
Calculator,        A Test Caption.  
  ,   . 

    330 _____________________________Windows   

     IParam    (  ),   
   .   ,  
  Calculator  IParam    -, 
,   ,       . 
       IParam        
,    Calculator.       
   .         
,    .   ? 
       ,     WM_SETTEXT   
  ,    .   SendMessage  
  ,       WM_SETTEXT.  
 ,          
      .    
  .      WM_SETTEXT,  
     (   )   
  .  IParam    
 ,  WM_SETTEXT    .   
  , ? 
     ,         
,      . (: 
      ,  wParam 
 IParam     -  .) 
       ,      ,  
 WM_GETTEXT. ,    : 

    char szBuf[200]; 
    SendMessage(FindWindow(NULL, "Calculator"), WM_GETTEXT, 
    sizeof(szBuf), (LPARAM) szBuf): 

    WM_GETTEXT ,     Calculator  
 ,    szBuf,   .    
    ,       2 
.   WM_GETTEXTLENGTH .     
   .       
 ,   . 
      ,       
WIDGETTEXT.     ,    
SendMessage,        ,   
 szBuf,   SendMessage  . 
     ,  ,    ,  .   
   (WM_USER + ) ,     
 ?   ,       
     .      
 WM_COPYDATA: 

    COPYDATASTRUCT cds; 
    SendMessage(hwndReceiver, WM_COPYDATA, (WPARAM) hwndSender, (LPARAM) &cds): 
     COPYDATASTRUCT  ,   WINUSER.H: 
    typedef struct tagCOPYDATASTRUCT { 
    DWORD dwData; 
    DWORD cbData: 
    PVOID IpData: 
    } COPYDATASTRUCT: 


    ______________ 11.      331 

         ,   
  .  dwData    
  .      32- . 
,     ,      
 . 
     cbData   ,    , a 
IpData     . ,   
IpData, ,  ,    . 
     SendMessage ,     WM_COPYDATA,  
    cbData       
     .    
- (destination window).      
   IParam    COPYDATASTRUCT, 
    -.  IpData  
     ,    , 
       -. 
         ,    WM_COPYDATA. 
-,    ;      
.   :     
  ,     ,  
 .   WM_COPYDATA    
   ,    ,    
    . 
    -,         
    - . ,  SendMessage  
 ,       
-  . 
    -,  WM_COPYDATA       
\32-  Winl6-nporpaMMy,   . , -,   
   32-  16- . 

    - CopyData 

     CopyData (COPYDATA.EXE) (.   . 11-3)  
  WM_COPYDATA       
  .         
   COPYDATA  -,   .  
  CopyData  ,   2  ;  
      : 
    Datal: )1!1send Data1 to other windows Data2: jsome more test 
data     Send DataZ to other windows 
       ,        
,       Datal  Data2.  
     Send Data* To Other Windows ( *  
 ),        
CopyData.        . 

    332 _____________________________Windows   I 

         .      
 : 
    1.   dwData  COPYDATASTRUCT  
 (   Send Datal To Other Windows)   
(   Send Data2 To Other Windows). 
    2.     ( )    
   ,      .  
        sizeof(TCHAR), 
     cbData  COPYDATASTRUCT. 
    3.  HeapAlhc,    ,    
        .    
   IpData    . 
    4.         . 
           .  ,  
   WM_COPYDATA, : 
    1.    ,    
 CopyData. 
    2.     CopyData. 
    3.    ,      
   CopyData.   ,   
   WM_COPYDATA.          
,   CopyData,  SendMessage,   
WM_COPYDATA  . (, ,   ,     
          .) 
    4.   , CopyData  HeapFree,   , 
     . 
               
 . 

    COPYDATA.C 
    /,**,*...,**..,,.*********,*.**,***..***...*.......*...,.*..**..*.,,*...*..... 
    : CopyData. 
    : Copyright  1995-1997,   (Jeffrey Richter) 
    .,.***********.*.**.*,...***........,.**..***,.***************.*.*.***......../ 
    
    include ".,\CmnHdr.H"           /* .   */ 
    ftinclude <windows,h> 
    ftinclude <windowsx.h> 
    ftinclude <tchar.h> 
    ffinclude "Resource.H" 
    
    / I Microsoft     WM_COPYDATA  
    // WINDOWSX.H.     ... 

    . . . 

    . 11-3.   CopyData 


    _____________ 11.      333 


    . 11-3  () 
    
    /* BOOL Cls_OnCopyData(HWND hwnd, HWND hwndFrom, 
    PCOPYDATASTRUCT cds) */ 
    
    define HANDLE_WM_COPYDATA(hwnd, wParam, IParam, fn) \ 
    ((fn)((hwnd), (HWND)(wParam), \ 
    (PCOPYDATASTRUCT)lParam), OL) 
    
    #define FORWARD_WM_COPYDATA(hwnd, hwndFrom, cds, fn) \ 
    (BOOL)(UINT)(DWORD)(fn)((hwnd), WM_COPYDATA, \ 
    (WPARAM)(hwndFrom), (LPARAM)(cds)) 
    
    ///////////////////////////////////////

    BOOL Dlg_OnCopyData(HWND hwnd, HWND hwndFrom, PCOPYDATASTRUCT cds) { 
    Edit_SetText( 
    GetDlgItem(hwnd, cds->dwData ? IDC_DATA2 : IDC_DATA1), 
    cds->lpData); 
    return(TRUE); 
    BOOL Dlg_Or]lniL[)ialog (HWND nwnd, HWND hwnaFocus. LPARAM IParaiii) { 
    
    //     
    chSETDLGICONS(hwnd, IDI_COPYDATA, IDI_COPYDATA); 
    
    //      
    Edit_SetText(GetDlgItem(hwnd, IDC_DATA1), __TEXT("Some test data")); 
    Edit_SetText.(GetDlgItem(hwnd. IDC_DATA2), __TEXT("Some more test data")): 
    return(TRUE); 
    i 
    
    void Dlg_OnCommand (HWND hwnd, int id, HWND hwndCtI, UINT codeNotil-y) { 
    HWND hwndEdit, hwndSibling; 
    COPYDATASTRUCT cds; 
    TCHAR szCaption[100], szCaptionSibling[100]; 
    switch (id) { 
    case IDC_COPYDATA1: 
    case IDC_COPYDATA2; 
    
    if (codeNotify != BN_CLICKED) 
    break: 
    hwndEdit = GetDlgItem(hwnd, 
    (id == IDC_COPYDATA1) ? IDC_DATA1 : IDC_DATA?)' 


    334 ______________________________Windows   


    . 11-3   () 

    II   COPYDATASTRUCT; 
    
    // 0 = ID_DATA1, 1 = ID_DATA2 
    cds.dwData = (DWORD) ((id == IDC_COPYDATA1) ? 0 : 1); 
    
    //      
    cds.cbData = (Edit_GetTextLength(hwndEdit) + 1) * sizeof(TCHAR); 
    
    //       
    cds.lpData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cds.cbData); 
    
    //         
    Edit_GetText(hwndEdit, cds.lpData, cds.cbData): 
    
    //     
    hwndSibling = GetFirstSibling(hwnd); 
    
    //     
    GetWindowText(hwnd, szCaption, chDIMOF(szCaption)); 
    while (IsWindow(hwndSibling)) { 
    
    //    ,  
    //      
    GetWindowText(hwndSibling, szCaptionSibling, 
    chDIMOF(szCaptionSibling)); 
    if (_tcscmp(szCaption, szCaptionSibling) == 0) { 
    //      ,  
    //  .     
    //  .    ,  
    //     WM_COPYDATA 
    //    , 
    FORWARD_WM_COPYDATA(hwndSibling, hwnd, &cds, SendMessage); 
    } 
    
    //      
    hwndSibling = GetNextSibling(hwndSibling); 
    
    //    
    HeapFree(GetProcessHeap(), 0, cds.lpData); 
    break; 
    case IDCANCEL: 
    EndDialog(hwnd, id); 
    break; 
    i 
    i. 

    . . . 


    ______________ 11.      335 


    . 11-3   () 

    BOOL CALLBACK Dlg_Proc (HWND hwnd. UINT uMsg. WPARAM wParam, LPARAM 
IParam) { 
    switch (uMsg) { 
    chHANDLE_DLGMSG(hwnd, WM_INITDIALOG, Dlg_OnInitDialog); 
    chHANDLE_DLGMSG(hwnd, WM_COMMAND, Dlg_OnCommand); 
    chHANDLE_DLGMSG(hwnd, WM_COPYDATA, Dlg_OnCopyData); 
    return(FALSE); 
    \, 
    ( 
    int WINAPI _tWinMain (HINSTANCE hinstExe. 
    HINSTANCE hinstPrev, LPTSTR pszCmdLine, int nCmdShow) { 
    chWARNIFUNICODEUNDERWIN95(); 
    DialogBox(hinstExe. MAKEINTRESOURCE(IDD_COPYDATA), NULL, Dlg_Proc); 
    return(O); 
    //////////////////////////   ///////////////////////////////// 


      

      16- Windows   (serialized input), 
,           
,      .   
     ,    . ,  
   : 
    , Alt+Tab  XYZ.       7 
 .4 ,     , 
           
 .  ,      
, -          
 .       .  Alt+Tab  XYZ 
      .     
   ,  ,   ,  
          . 
,          .  
   . 
    Microsoft       .  16- 
Windows      Ctrl+Alt+Del,   
  ,       
.      ,    
  ,       .    
,   16- Windows     
  ,      . 
    4.          7 .  
 , ,   WM_KEYDOWN  WM_KEYUP.   
   7 ,       . 

    336 ______________________________Windows   

         (deserialized input).   
        . 
,    :   , ,     
  ,   -  CAB? ,  . 
    , Alt+Tab  XYZ,  ,    
  Alt+Tab,    XYZ .,    
  . 
     Win32     ,    ,   
16- Windows.        ,  
   .     . 

       

             (raw 
input thread, RIT).         
    ,     
    RIT.    RIT , 
    ,     
 WM_KEY*, WM_?BUTTON*  WM_MOUSEMOVE,      
    . 
     . 11-1  ,        
      .    
,          
  ,   . 
       (. 11-4):      .  
    ,      :   .  -  
    ,      
   .    ,  
   ,       . 

                                          
    -   ^^                            ^ ^^ 
       j___   ^             - ^sp^b 
 v 
    |    ^^      ^^                  |    -^^.    ^^ 
      |                                 ;   | 
      | 

    . 11-4.         ;  
          

         RIT  ,   
    .      RIT  
,      ,    
 (WM_?BUTTON*  WM_MOUSEMOVE)     , 
  .    , RIT , 
  , . .        
.       
   . 

    ______________ 11.      337 

           ,    
    , RIT      
         . , RIT 
      : 

     
              Windows 95                    Windows NT 

    Alt-1-Tab             .            , 
    				    RIT.             RIT. 
    Alt+Esc              ,            , 
    				    RIT.             RIT. 
    Ctrl+Esc             Start ()          Start 
    				  ,                     . 
    Ctrl+Alt+Del                  
    				 Close Program (     Windows NT Security. 
			     ). 


         

              
        (   
)   Attach Threadlnput 

    BOOL AttachThreadInput(DWORD idAttach, DWORD idAttachTo, BOOL fAttach); 

               
   (. 11-5).  , idAttach,  
 ,        . 
  idAttachedTo    ,    
    . , , fAttach    TRUE, 
     ,  FALSE   
      .     
      ,  AttachThreadInput 
  . 
         ,     
AttachThreadInput,      ,   
      TRUE: 

    AttachThreadInput(idThreadB, idThreadA, TRUE); 

        ,      ,  
       .   
      ,      
,   AttachThreadInput   FALSE   fAttach. 
    ,      ,  
  .        
  ,       
16- Windows.          
  . , ,   16-   
 Windows 95  Windows NT,      
, . .     16- Windows. 
         Win32-cncTeMbi,    
    .  -  
    ,     . 
  ,    AttachThreadInput. 

    338 ______________________________Windows   

                                           
    ^^   ^^                             ^   ^^ 
     A   S-__   ^    ^       |  
 v 
    |    ~^^      ^^                   |    -^       ^^ 
      |                                     | 
      | 
    ^MM^WNM^ 

    . 11-5.     ,       
    

    VWINDOWS/ Windows NT    16- Windows 
   .    16- 
,     ,   
 .          
,      .  , Windows 
NT    16- ,   16- 
Windows.    ,    16- , 
.?    .       
 ,       . 

           , 
   - (journal record hook)  
- (journal playback hook).   , 
      , 
   . 
     -  ,    
    ,  .  
     .      
  -,     
    ,    
   ()   . 
          
.  ,  Recorder ( ), 
  16- Windows,     
     -  
-.  Recorder    Windows 95  Windows NT, 
     . 
       ,     AttachThreadInput. 
,    .      
.     CreateWindow,   WS_CHILD  
       .   
    AttachThreadInput,   ( 
  )     ,   , 
   .        
    .   ,  , 
  ,   ,     

    ______________ 11.      339 

       .      , 
   ,         . 

       

    ,     MS-DOS,    ,  
     .  ,  
,  , ,  ,     
    ,  ,  ,     . 
       16- Windows,     
   . ,  ,   
    .    
      ,   
   ,      
  ,    ,   
     .   
,        , 
     ,    
 , , ,     . 
           Win32.  - 
   ,      
  ,       . . 
 Win32   .    
 ,      .    
        
,      .    
        , 
      .5 
        ,       
?    ,  .    , 
     ,      
     ,     . 
              
(local input state).      , 
     .-11..     
          
.     _ :   
~~~" ' 
    : 
          ; 
       ; 
              
(synchronous key state array); 
       . 
    5.      ;    
          
.        ,   
     . 

    340 ____________________________Windows   

    : 
        ; 
        ; 
        . 
             ,   
  ,   ,  ,  ,  . 
.     .    ,    
     ,          .  
     :       ,   
 .  ,    .  ,  
      -    . 

         

    Win32  16- Windows     -. 
      Win32,        
 16- Windows  ,      . 
 ,        16- 
Windows    ,     Win32. 
     Win32        (RIT) 
    - ,     . RIT 
        
 .    GetMessage,   
       ( ),    
     (. 11-6). 

       | 
        1 |               
 2 I 
     A j    j  , ,1            D j    |   F | 

    . 11-6. RIT        
     

          ,  ,   
  RIT    ,    
   ,      .   
    SetFocus.       RIT 
  1,   SetFocus     ,    
   . ,  ,    
      ,  ,  
,       . 
    , ,   1 -    RIT  
 SetFocus,     .      
  - ,   ,      
, ~"   ,    
  RIT.   1   ,      
 ,  - . 

    . 11.      341 

      :  1   RIT,   2  
SetFocus,     .      
    2  ,    RIT  
           
 .     RIT      
   2. 
             2,   
 WM_SETFOCUS.     ,    , 
 ,           
 .  ,     .  
 SetFocus         . 
    ,      , ,   
WM_SETFOCUS,   ,      
     .      . 
              
(,  ),      WM_KILLFOCUS. 
 ,  ,   ,   
  ,   ,  ,  
,  :    .   GetFocus    
NULL,   ,     .    
 16- Windows  Win32     ,  
    ,  GetFocus   NULL. 
     SetActiveWindow      : 

    HWND SetActiveWindow(HWND hwnd); 

     16- Windows       
  .  Win32  SetActiveWindow   
 SetFocus.  ,       , 
  ,    .      
 ,    .  SetActiveWindow  GetActiveWindow. 

    HWND GetActiveWlndow(HWND hwnd); 

     ,   GetFocus,     , 
       .  
,      ,   NULL. 
       Win32  ,   16- Windows: , 
   ,   . Microsoft 
,        ,  
 . 
    : , ,     
      .  ,   
  .   ,      
        ,    
   ?       .  
,      ,      ,  
   ,  ,       . 
     -     - . 
        ,   
  RIT     .     
SetForegroundWindow  16- Windows : 

    BOOL SetForegr-oundWindow(HWND hwnd): 

    342 ______________________________Windows   

      ,   hwnd,    
    ,     .  
SetForegroundWindow  GetForegroundWindow: 

    BOOL GetForegroundWindow(HWND hwnd): 

           . 
         ,   Z- ,  
  : Bring WindowTo Top  SetWindowPos.     
16- Windows,    Win32: 

    BOOL BringWindowToTop(HWND hwnd); 

         (foreground) , Win32  
    ,     .  , 
Win32  RIT         , 
        .   
,  BringWindowToTop,    ,  
   . 
    SetWindowPos      (   
 HWND_TOP),      (    HWND_BOTTOM): 

    BOOL SetWindowPos(HWND hwnd, HWND hwndInsertAfter. 
    int x, int y, int ex, int cy, UINT fuFlags): 

    (,  BringWindowToTop     
SetWindowPos   ,  HWND_TOP.) 
              
   .     
        ,   
       .  
       .  
GetAsyncKeyState     ,     : 

    SHORT GetAsyncKeyState(int nVirtKey); 

     nVirtKey    ,    
 .    ,      
(1)  -i (0).     ,    
,     ( )  . 
  VK_LBUTTON,  ,    .  Win32 
      0 ( ),   
  ,   ,   ,     
 . 
     GetKeyState   GetAsyncKeyState ,   
   ,       
 : 

    SHORT GetKeyState(int nVirtKey); 

          ;   ,    
.           . 
   (Richter)   (Locke) Windows 95: A Developer's Guide, 1995 
( 8 Keystroke Processing}." 

       

             
 .  ,   ,     
, Win32   -     
 ,        . 
,     . 

     11.      343 

               
. ,  16- Windows  ShowCursor (FALSE), 
 ,     ShowCursor (TRUE),   
       . 
    Win32   .   ,    
 ,  ,  ShowCursor (FALSE),    
 ,     ,   . 
             
 -  .  16- Windows  
  ClipCursor. 

    BOOL ClipCursor-CCONST RECT *lprc); 

          ,  
   Iprc.     ,    
        .  Win32  
  .      
  . ,     
 (asynchronous activation event), . .   
    ,   Ctrl+Esc   
 SetForegroundWindow,     
,      . 
         ?   ( SetCapture),  
,       RIT    
   ,          
,     ReleaseCapture. 
        16- Windows  SetCapture  
   ReleaseCapture,       
  .    ,   Win32 
,     .    SetCapture 
 RIT         
   .   SetCapture  
      . 
       SetCapture,     
.       ,     . 
 SetCapture    ,   ~ 
,    16- Windows.    ,  
   , RIT      
      .    
    ,   ,   
    .     
7''^5   . 
      SetCapture  ,     
 .  ,       , 
   ,      , 
      .  ,  
    ,      
 ,    . 
     ,     ,  
 ,       
      .     
   ,    ,     
   . , Microsoft ,     
      

    344 ______________________________Windows   

    click-and-drag (--).       
 , ,   ,  
,     Win32    16- Windows. 
        ,   ,  
 .  ,    SetCursor    
,       
.  ,      
   ,  . 
    ,        , 
   WM_SETCURSOR,    SetCursor,  
    .  SetCursor,   
 -  . (     
 . .)        
    .  16- Windows    
,   Windows 95  Windows NT      
 . 
         ,     
,      .    
   ,   -  .  
    WM_SETCURSOR,        
,       .   , 
        (     
     ),   
  (     ).   
 ,           . 

    - LISLab 

     LISLab (Local Input State Laboratory, LISLAB.EXE) (.  
 . 11-7)   ,     
     .     
       LISLAB  -, 
  . 
      Notepad,   LISLab,     
 : 
           Windows ();    
  , . .       
WM_TIMER    

    ____________ 11.      345 

     GetFocus, GetActiveWindow, GetForegroundWindow, GetCapture  
GetClipCursor.       (  
      ),    
            . 
         (  Notepad),   
Focus ( )  Active ()   (No Window) [( )],  
 Foreground ()   [Notepad] Unfilled - Notepad.  
,   Notepad  LISLab ,    
,     . 
        .  SetFocus  
  Function ()       
.    Delay ()   ( ),   
 LISLab  ,    SetFocus.   , 
,     .   ,  
  Delay. 
     QKHO (      SetFocus)  
 Notepad Windows And Self,      . 
 ~  [Notepad] Untitled - Notepad.   
   SetFocus.   Delay  ,   
  Windows. .    . 
           Notepad,   
Attach  Notepad (  Notepad),   LISLab : 

    AttachThreadInput(GetWindowThreadProcessId(g_hwndNotepad, NULL), 
GetCurrentThreadIdO. TRUE); 

         LISLab     
  ,   Notepad.  ,  LISLab  
    Notepad. 
        Attach To Notepad    Notepad, 
  LISLab   : 
    ,       , LISLab  
  ,   Notepad.    
 ,         .    
  Notepad   File Open,  LISLab,    
Notepad,  ,   Notepad   ,   
  . . 

    346 ______________________________Windows   

        LISLab,   Delay    
 SetFocus    Notepad.      
,     . 
      ,  ,   SetActiveWindow, 
SetForegroundWindow, BringWindowToTop  SetWindowPos,     
 Function.       ,    
;         . 
     ,   . (  LISLab 
        .)  
   .    LISLab  Notepad, 
  Detach From Notepad (  Notepad).    
Notepad Windows And Self  >This Dialog Box<,    Function  
SetFocus     10 .    Delay  
  Notepad,    .    
Notepad  ,    10 . 
        ,      
 Pending ().   10   Pending   
Executed (),     .   
    ,  ,    
    Function.     - 
  Notepad.  ,   LISLab,   Notepad   
,        .     RIT 
    Notepad. 
         : SetFocus  SetActive Window  
 ,          
.        PrevWnd ( 
).  ,     SetForegroundWindow 
   GetForegroundWindow,    , 
   .       
 PrevWnd. 
         .  ,   
!    LISLab (   -    
),       .    
        Mouse Messages 
Received (,   ).  ,     
,       .    
          ,  , 
      . 
           ,   
   Click Right Mouse Button To Set Capture (  , 
  ),        . 
   LISLab   SetCapture,    
  . :     LISLab 
   Windows. 
    ,    ,      
LISLab      ,   .  
      LISLab,  - 
   .      
  ,       .   
    16- Windows. 
          Win32-cHcreMbi  16- 
Windows.     ,  . ,    
 , ,   -   
.        LISLab,   
    ,      
   Mouse Messages Received.     - 
   LISLab,   :  

    ______________ 11.      347 

    - ,         
   .     
  16 Windows. 
     ,      : 
               LISLab 
(    ReleaseCapture); 
      ,     (   
LISLab).         LISLab 
      . 
         ,     Capture () 
  Windows      ,       
 .    ,   :    
    ,    
 .     Top, Left (   
),  LISLab  : 

    RECT : 
    SetRect(&rc, , , 
    GetSystemMetrics(SM_CXSCREEN) / 2, 
    GetSystemMetrics(SM_CYSCREEN) / 2); 

            . 
       Alt+Tab,  , 
  - .       
    : 

    Windows 95            
  . 
    Windows NT         ( 
    .) 
    Windows NT        Task Manager. 

              
Remove ()    LISLab (      
  ). 
      Hide ()  Show ()   : 

    ShowCursor(FALSE); 

     

    ShowCursor(TRUE); 

      ,         
LISLab.        ,   . 
    Hide   Show. ,  
    : 5    Hide, 
      Show,     . 
          Infinite Loop ( ).  
   : 

    SetCursor(LoadCursor(NULL, IDC_NO)); 
    for (; ;) 

    348 ______________________________Windows   

           ,   
  .    Infinite Loop  
    .     
  LISLab,  ,     . 
      ,   ,    . 
           LISLab,  , 
   ,        
 .  16- Windows ,    
,    ,    .   Win32  
      . 
    :       LISLab  ,  
  ,   LISLab  WM_PAINT  ,  
   .       
 :    . , 
      ,    ,  
  ,         
    . 
       ,          . 
   ?   Windows 95    
 Ctrl+Alt+Del,      Close Program ( 
 ). 
     Windows NT          
 ,    Task Manager: 
          ,   
,     Local Input State Lab     End 
Task.    LISLab -,  ,  
  .     : 

    _ 11.      349 

        End Task    ,   LISLab 
.  Cancel  ,     
,    Wait (  Windows NT)   
;   ,    ,    
5       .   ,  LISLab 
   - ,      
.     End Task,   LISLab  . 
           
.          
,       .  , 
 Windows 95,  Windows NT    ,  
  ,     ! 

    LISLAB.C 
    : LISLab. : Copyright  1995-1997,   (Jeffrey Richter) 
    ttinclude ". . \Cn)nHdr, H"           /* .   */ 
    ftinclude <windows.h> 
    fflnclude <windowsx.h> 
    #include <tchar.h> 
    flinclude <string.h> 
    ftinclude <stdio.h>               //  sprintf 
    #include "Resource.H" 
    //////////////////////////
    ftdefine TIMER_DELAY (1 * 1000) // 1  * 1000  
    UINT  g_uTimerId = 1; 
    int   g_nEventId = 0; 
    DWORD g_dwEventTime = 0; 
    RWND  g_hwndSubject = NULL: 

    . . . 

    . 11-7.   LISLab 

    350 ______________________________Windows   


    . 11-7  () 

    HWND  g_hwndNotepad = NULL; 
    //////////////////////////////.//.'///////////////////////////,///////////,/,1 
    void CalcWndText (HWND hwnd, LPTSTR szBuf, int nLen) { 
    TCHAR szClass[50], szCaption[50], szBufT[150]; 
    if (hwnd == (HWND) NULL) { 
    _tcscpy(szBuf. __TEXT("(no window)")); 
    return: 
    } 
    if (!IsWinaow(hwnd)) { 
    _tcscpy(szBur, __TEXT("(invalid window)")); 
    return; 
    } 
    GetClassName(hwnd, szClass, chDIMOF(szClass)); 
    GetWindowText(hwnd, szCaption, chDIMOF(szCaption)): 
    _stprintr(szBurT, __TEXT("[%s] %s"), (LPTSTR) szClass, 
    (*szCaption == 0) ? (LPTSTR) __TEXT("(no caption)") 
    : (LPTSTR) szCaption); 
    _tcsncpy(szBuf, szBufT, nLen - 1); 
    szBuf[nLen - 1] = 0; //      
    \ 
    //     ,   
    // WALKWINDOWTREEDATA      
    // WalkWindowTree()      WalkWindowTreeRecurse 
    // ,  WalkWindowTreeRecurse 
    typedef struct { 
    HWND  hwndLB;          //      
    HWND  hwndParent;      //    
    int   nLevel;          //   
    int   nindex;          //    
    TCHAR szBuf[100];      //   
    int   iBuf;            //   szBuf 
    } WALKWINDOWTREEDATA, .LPWALKWINDOWTREEDATA; 
    void WalkWindowTreeRecurse (LPWALKWINDOWTREEDATA pWWT) { 
    const int nIndexAmount = 2; 
    HWND hwndGhild; 
    pWWT->nLevel++: 

    . . . 

    _____________ 11.      351 


    . 11-7  () 

    if (!IsWlndow(pWWT->hwndParent)) 
    return; 
    for (pWWT->iBuf = 0; pWWT->iBuf < pWWT->nLevel * nIndexAmount; pWWT->iBuf++) 
    pWWT->szBuf[pWWT->iBuf] = __TEXT(' ); 
    CalcWndText(pWWT->hwhdParent, &pWWT->szBuf[pWWT->iBuf]. 
    cnDIMOF(pWWT->szBuf) - pWWT->iBuf); 
    pWWT->n!ndex = ListBox_AddString(pWWT->hwndLB, pWWT->szBuf); 
    ListBox_SetItemData(pWWT->hwndLB, pWWT->nIndex, pWWT->hwndParent); 
    hwndChild = GetFirstChild(pWWT->hwndParent); 
    while (hwndChlld != NULL) { 
    pWWT->hwndParent = hwndChild; 
    WalkWindowTreeRecurse(pWWT): 
    hwndChild = GetNextSibling(hwndChiid): 
    } 
    pWWT->nLevel--: 
    void WalkWindowTree (HWNU liwndLB, HWND hwndParent) { 
    WALKWINDOWTREEDATA WWT; 
    WWT.hwndLB = hwndLB; 
    WWT.hwndParent = hwndParent; 
    WWT.nLevel = -1; 
    WalkWindowTreeRecurse(&WWT); 
    } 
    BOOL Dlg_OnInitDialog (HWND hwnd, HWND hwndFocus, LPARAM IParam) { 
    HWND hwndT: 
    //      
    chSETDLGICONS(hwnd, IDI_LISLAB, IDI_LISLAB); 
    //     " "    
    //   
    SetClassLong(hwnd, GCL_HCURSOR, (LONG) LoadCursor(NULL, IDC_UPARROW)) 
    g_uTimerId = SetTimer(hwnd, g_uTimerId, TIMER_DELAY, NULL); 
    hwndT = Get01gltem(hwnd, IDC_WNDFUNC); 
    ComboBox^AddString(hwndT, __TEXT("Set Focus")): 

    iM. uieo. imp. 

    352 ____________________________Windows   


    . 11-7  () 

    ComboBox_AddString(hwndT, __TEXT("SetActiveWindow")); 
    ComboBox_AddSt ring(hwndT, __TEXT("SetForegroundWnd")); 
    ComboBox_AddString(hwndT, __TEXT("BringWindowToTop")); 
    ComboBox_AddString(hwndT, __TEXT("SetWindowPos-TOP")); 
    ComboBox_AddSt ring(hwndT, __TEXT("SetWindowPos-BTM")): 
    CornboBox_SetCurSel(hwndT, 0); 
    //         Explorer 
    
    //     
    hwndT = GetDlgItem(hwnd, IDC_WNDS); 
    ListBox_AddString(hwndT, __(""> This dialog box <--")); 
    \      ListBox_SetItemData(hwndT, 0, hwnd); 
    ListBox_SetCurSel(hwndT, O): 
    //   Notepad 
    g_hwndNotepad = FindWindow(__TEXT("Notepad"), NULL); 
    WalkWindowTree(hwndT, g_hwndNotepad); 
    return(TRUE); 
    } 
    //////////////////////////////////////////////////////// 
    void Dlg_OnDestroy (HWND hwnd) { 
    if (g_uTimer!d != 0) 
    KillTi]ner(hwnd, g_uTimerId); 
    } 
    l!llilllllllillllllllllllllltllll//ll/ll/liili///liltli/l///:i /i /- 
/.''/,'/'/ // '. 
    void Dlg_OnCommand (HWND hwnd, int id, HWND hwndCtl. UINT codeNotify) { 
    HWND hwndT; 
    RECT re; 
    switch (id) { 
    case IDCANCEL: 
    EndDialog(hwnd, D); 
    break; 
    case IDC_FUNCSTART: 
    g_dwEventTime = GetTickGountO + 10DD * 
    GetDigItemInt(hwnd. IDC_DELAY, NULL, FALSE); 
    hwndT = GetDlgItem(hwnd, IDC_WNDS); 
    g_hwndSubject = (HWND) ListBox_GetItemData(hwndT, 
    ListBox_GetCurSel(hwndT)); 
    g_nEvent!d = ComboBox_GetCurSel(GetDlgItem(hwnd, IDCJilNDFUNC)); 
    SetWindowText(GetDlgItem(hwnd, IDC_EVENTPENDING), __TEXT("Pending")); 
    break; 

    [... L.-iri). . 


    _____________ 11.      353 


    . 11-7   () 

    case IDC_THREADATTACH; 
    AttachThreadInput(GetWlndowTrireadProcessId(g_hwndNotepad. NULL), 
    GetCurrentTI-ireadIdO, TRUE); 
    break; 
    case IDC_THREADDETACH: 
    AttachThread Input(GetWindowThread Process Id(g_hwndNote pad. NULL), 
    GetCurrentThreadIdO, FALSE); 
    break; 
    case IDC_SETCLIPRECT: 
    SetRect(&rc, , , 
    GetSystemMetrics(SM_CXSCREEN) / 2, 
    GetSystemMetrics(SM_CYSCREEN) / 2); 
    ClipCursor(&rc); 
    break; 
    case IDC_REMOVECLIPRECT: 
    ClipCursor(NULL); 
    break; 
    case IDC_HIDECURSOR: 
    ShowCursor(FALSE); 
    break; 
    case IDC_SHOWCURSOR: 
    ShowCursor(TRUE); 
    break: 
    case IDC_INFINITELOOP: 
    SetCursor(LoadCursor(NULL, IDC_NO)); 
    for (:;) 
    break; 
    void AddStr (HWNO hwndLB, LPCTSTR szBuf) { 
    int nindex; 
    do { 
    nindex = ListBox_AddString(hwndLB, szBuf); 
    if (nindex == LB_ERR) 
    ListBox_DeleteString(hwndLB, 0); 
    } while (nindex == LB_ERR); 

    . . . 

    354 ______________________________Windows   


    . 11-7   () 

    ListBox_SetCurSel(hwndLB, nindex); 
    i i 
    int Dlg_OnRButtonDown (HWND hwnd, BOOL fDoubleClick, 
    int x, int y, UINT keyFlags) { 
    TCHAR szBuf[100]; 
    _stprintf(szBuf, 
    __TEXT("Capture=%-3s. Msg=RButtonDown, ") 
    __TEXT("DblClk=%-3s, x=%5d. y=%5d"), 
    (GetCaptureO == NULL) ? __TEXT("No") : __TEXT("Yes"), 
    fDoubleClick ? __TEXT("Yes") : __TEXT("No"), x, y); 
    AddStr(GetDlgItem(hwnd. IDC_MOUSEMSGS), szBuf); 
    if (!fDoubleClick) { 
    SetCapture(hwnd); 
    } else { 
    ReleaseCapture(): 
    } return(O); 
    } 
    ///////////////////////////////// 
    int Dlg_OnRButtonUp (HWND hwnd, int x, int y, UINT keyFlags) { 
    TCHAR szBuf[100]; 
    _stprintf(szBuf, __TEXT("Capture=%-3s, Msg=RButtonUp,   x=%5d, y=%5d"), 
    (GetCaptureO == NULL) ? __TEXT("No") : __TEXT("Yes"). x. y); 
    AddStr(GetDlgItem(hwnd, IDC_MOUSEMSGS), szBuf): 
    return(O); 
    } 
    //////////////////////////////////
    int Dlg_OnLButtonDown (HWND hwnd, BOOL fDoubleClick. 
    int x, int y, UINT keyFlags) { 
    TCHAR szBuf[100]; 
    _stprintf(szBuf, __TEXT("Capture=%-3s, Msg=LButtonDown, ") 
    __TEXT("DblClk=%-3s, x=%5d, y=%5d"), 
    (GetCaptureO == NULL) ? __TEXT("No") : __TEXT("Yes"), 
    fDoubleClick ? __TEXT("Yes") : __TEXT("No"), x, y): 

    . . . 

    _____________ 11.      355 


    . 11-7   () 

    Add8tr(GetDlgItem(hwnd, IDC_MOUSEMSGS), szBuf); 
    return(O); 
    } 
    void Dlg_OnLButtonUp (HWND hwnd, int x, int y, UINT keyFlags) { 
    TCHAR szBuf[100]; 
    _stprintf(szBuf, __TEXT("Gapture=%-3s, Msg=LButtonUp,   x=%5d, y=%5d"), 
    (GetCaptureO == NULL) ? __TEXT("No") : TEXT ("Yes"), x, y); 
    Add8tr(GetDlgItem(hwnd, IDC_MOUSEMSGS), szBuf); 
    } 
    /////////////////////////////////
    void Dlg_OnMouseMove (HWND hwnd, int x, int y, UINT keyFlags) { 
    TCHAR szBuf[100]: 
    _stprintf(szBuf, __TEXT("Capture=%-3s, Msg=MouseMove, x=%5d, y=%5d"), 
    (GetCaptureO == NULL) ? __TEXT("No") ; _TEXT("Yes"), x, y); 
    AddStr(GetDlgItem(hwnd, IDC_MOUSEMSGS), szBuf); 
    } 
    void Dlg_OnTimer (HWNO hwnd, UINT id) { 
    TCHAR szBuf[100]; 
    RECT re; 
    HWND hwndT: 
    CalcWndText(GetFocus(), szBuf, chDIMOF(szBuf)); 
    SetWindowText(GetDlgItem(hwnd, IDC_WNDFOCUS), szBuf); 
    CalcWndText(GetCapture(), szBuf, chDIMOF(szBuf)); 
    SetWindowText(GetDlgItem(hwnd, IDC_WNDCAPTURE), szBuf): 
    CalcWndText(GetActiveWindow(), szBuf, chDIMOF(szBuf)); 
    SetWindowText(GetDlgItem(hwnd, IDC_WNDACTIVE), szBuf); 
    CalcWndText(GetForegroundWindow(), szBuf, chDIMOF(szBuf)); 
    SetWindowText(GetDlgItem(hwnd, IDC_WNDFOREGROUND), szBuf): 
    GetClipCursor(&rc): 
    _stprintf(szBuf, 
    __TEXT("left=%d, top=%d, right=%d, bottom=%d"), 
    rc.left, re.top, re.right, re.bottom); 

    . . if tip. 

    356 ______________________________Windows   

    . 11-7  () 


    SetWindowText(GetDlgItem(hwnd, IDC_CLIPCURSOR), szBuf); 
    if ((g_dwEventTime ==0) !! (GetTickCount() < g_dwEventTime)) 
    return; 
    switch (g_nEventId) { 
    case 0: // SetFocus 
    g_hwnd8ubject = SetFocus(g_hwndSubject); 
    break; 
    case 1: // SetActiveWlndow 
    g_hwndSubject = SetActiveWindow(g_hwndSubject); 
    break; 
    case 2: // SetForegroundWindow 
    hwndT = GetForegroundWindowO; 
    SetForegroundWindow(g_hwndSubject); 
    g_hwnd3ubject = hwndT; 
    break; 
    case 3: // BringWindowToTop 
    ringWindowToTop(g_hwndSubject); 
    break; 
    case 4: // SetWindowPos   HWND_TOP 
    SetWindowPos(g_hwndSubject, HWNDJTOP, , , . , 
    SWP_NOMOVE ; SWP_NOSIZE); 
    g_hwnd3ubject = (HWND) 1; 
    break: 
    case 5; // SetWindowPos   HWND_BOTTOM 
    SetWindowPos(g_hwndSubject. HWND_BOTTOM, , , , , 
    SWP_NOMOVE ; SWP_NOSIZE); 
    g_hwndSubject = (HWND) 1; 
    break: 
    \, 
    i 
    if (g_hwndSubject == (HWND) 1) { 
    SetWindowText(GetDlgItem(hwnd, IDC_PREVWND), __TEXT("Can't tell.")); 
    } else { 
    CalcWndText(g_hwndSubject, szBuf, chDIMOF(szBuf)); 
    SetWindowText(GetDlgItem(hwnd, IDC_PREVWND), szBuf); 
    } 
    g_hwnd8ubject = NULL; g_nEvent!d = 0; g_dwEventTime = 0; 
    SetWindowText(GetDlgItem(hwnd, IDC_EVENTPENDING), __TEXT("Executed")); 
    } 
    ///////////////////////////////////////////////////// 

    . . . 

    _____________ 11.       357 


    . 11-7  () 

    BOOL CALLBACK Dlg_Proc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM 
IParam) { 
    switch (uMsg) { 
    chHANDLE_DLGMSG(hwnd, WM_INITDIALOG, Dlg_0nlnit0ialog); 
    chHANDLE_DLGMSG(hwnd, WM_OESTROY, Dlg_OnDestroy); 
    GhHANDLE_DLGMSG(hwnd, WM_COMMANO, Dlg_OnCommand); 
    chHANDLE_DLQMSG(hwnd, WM_MOUSEMOVE, Dlg_OnMouseMove): 
    chHANDLE_DLGMSG(hwnd. WM_LBUTTONDOWN, 01g_OnLButtonDown); 
    chHANDLE_DLGMSG(hwnd, WM_LBUTTONDBLCLK, Dlg_OnLButtonDown); 
    chHANDLE_DLGMSG(hwnd, WM_LBUTTONUP, 01g_OnLButtonUp); 
    chHANDLE_DLGMSG(hwnd, WM_RBUTTONDOWN, Dlg_OnRButtonDown); 
    GhHANDLE_DLGHSG(hwnd, WM_RBUTTONDBLCLK, Dlg_OnRButtonOown); 
    chHANDLE_DLGMSG(hwnd, WM_RBUTTONUP, Dlg_OnRButtonUp); 
    chHANDLE_DLGMSG(hwnd, WM_TIMER, Dlg_OnTimer); 
    } return(FALSE); 
    \ / 
    ////////////// 
    int WINAPI _tWinMain (HINSTANCE hinstExe. 
    HINSTANCE hinstPrev. LPTSTR pszCmdLine, int nCmdShow) { 
    chWARNIFUNICODEUNDERWIN95(); 
    DialogBox(hinstExe, MAKEINTRESOURCE(IDD_LISLAB), NULL, Dlg_Proc); 
    return(O); 
    } 
    //////////////////////////////////   
