我先用findwindow找到了hwnd然后PostMessage(hwnd,WM_CHAR,'2',0);
但是我用记事本来试验都无法成功键入字符

解决方案 »

  1.   

    你要键入字符要查找的不只是窗体,找到窗体以后还要找到里面的编辑框组件,用spy++看一下记事本,记事本里面就只有一个编辑框,一个状态栏。
    先通过FindWindow找到窗体的句柄,然后通过FindWindowEx找到记事本窗体里面的编辑框的句柄,向编辑框组件发送字符就能够显示
    HWND formHandle=NULL;
    HWND childHandle=NULL;
    formHandle=FindWindow(NULL,"记事本窗体名字");
    if(formHandle==NULL) return;
    childHandle=FindWindowEx(formHandle,NULL,NULL,NULL);//看spy++,第一个子句柄就是编辑框,找到这个句柄,就可以发送消息了
    if(childHandle==NULL) return;
    PostMessage(childHandle,WM_CHAR,'2',0);//这里发送消息就能在记事本的编辑框里面显示了
      

  2.   

    WM_CHAR消息并不是都支持, 有可能需要发送WM_KEYDOWN  和WM_KEYUP才行
      

  3.   

    确保找到了正确的窗口句柄
    BOOL SendCharToNotepand(UINT vKey)
    {
      BOOL bRet = FALSE;
      HWND hNotePad = FindWindow(_T("Notepad"), NULL);
      HWND hEdit = FindWindowEx(hNotePad, NULL, _T("Edit"), NULL);
      if(hEdit)
      {
        bRet = ::PostMessage(hEdit, WM_CHAR, vKey, 0);
      }
      return bRet;
    }  
      

  4.   

    keybd_event()/SendInput()模拟按键~
      

  5.   

    列子://
    LPARAM MakeKeyLparam1(int VirtualKey, int flag) 

        LPARAM s; 
        unsigned char firstByte; 
    // if (flag == WM_KEYDOWN) firstByte = 0;
    // else                    firstByte = 0xc0;    switch (flag)
        {// 16–23 Specifies the scan code. 
          case WM_KEYDOWN:    firstByte = 0;   break;// 0000 0000
          case WM_KEYUP:      firstByte = 0xC0;break;// 1100 0000
          case WM_CHAR:       firstByte = 0x20;break;// 0010 0000
          case WM_SYSKEYDOWN: firstByte = 0x20;break;
          case WM_SYSKEYUP:   firstByte = 0xE0;break;// 1110 0000
          case WM_SYSCHAR:    firstByte = 0xE0;break;// 1110 0000
        }
    //
        int scanCode; 
        scanCode = MapVirtualKey(VirtualKey, 0); 
    afxDump << VirtualKey << ";" << scanCode << "\n";
    //
        unsigned char secondByte; 
        secondByte = scanCode & 0xff;     s = (firstByte << 24) | (secondByte << 16) | 0x0001; 
    //
        return s; 
    }
    void CToNotePadDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    HWND hwnd=::FindWindow("NotePad","无标题 - 记事本");
    if( hwnd)
    {
    // ::BringWindowToTop(hwnd);
    #if 0 // Alt+F
    // keybd_event(VK_MENU,0,0,0);
    // keybd_event('F',0,0,0);
    // keybd_event('F',0,KEYEVENTF_KEYUP,0);
    // keybd_event(VK_MENU,0,KEYEVENTF_KEYUP,0);
    // CTRL+O
    keybd_event(VK_CONTROL,0,0,0);
    keybd_event('O',0,0,0);
    keybd_event('O',0,KEYEVENTF_KEYUP,0);
    keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
    // ::PostMessage(hwnd, WM_COMMAND,MAKEWPARAM(2,BN_CLICKED),NULL);//打开“打开”对话框 //第2句
    Sleep(100);
    hwnd=::FindWindow(NULL,"打开");
    // 1148 = 0x47C cmb13 ComboBoxEx32
    HWND hCmb13 = ::GetDlgItem(hwnd,0x047C);
    if(hCmb13)
    {
    Sleep(500);
    ::SendMessage(hCmb13,WM_SETTEXT,0,(LPARAM)"abc.txt");
    }
    #else // OK
    //WM_SYSKEYDOWN 
    //nVirtKey = (int) wParam;    // virtual-key code 
    //lKeyData = lParam;          // key data
    // Alt+F must
    ::PostMessage(hwnd, WM_SYSKEYDOWN, VK_MENU, MakeKeyLparam(VK_MENU,WM_SYSKEYDOWN));
    ::PostMessage(hwnd, WM_SYSKEYDOWN, 'F', MakeKeyLparam('F',WM_SYSKEYDOWN));
    ::PostMessage(hwnd, WM_CHAR, 'F', MakeKeyLparam('F',WM_CHAR));
    ::PostMessage(hwnd, WM_SYSKEYUP, 'F', MakeKeyLparam('F',WM_SYSKEYUP));
    ::PostMessage(hwnd, WM_KEYUP, VK_MENU, MakeKeyLparam(VK_MENU,WM_KEYUP));
    // Ctrl + O
    // ::PostMessage(hwnd, WM_SYSKEYDOWN, VK_CONTROL, MakeKeyLparam1(VK_CONTROL,WM_SYSKEYDOWN));
    // ::PostMessage(hwnd, WM_SYSKEYDOWN, 'O', MakeKeyLparam1('O',WM_SYSKEYDOWN));
    // ::PostMessage(hwnd, WM_CHAR, 'O', MakeKeyLparam1('O',WM_CHAR));
    // ::PostMessage(hwnd, WM_SYSKEYUP, 'O', MakeKeyLparam1('O',WM_SYSKEYUP));
    // ::PostMessage(hwnd, WM_KEYUP, VK_CONTROL, MakeKeyLparam1(VK_CONTROL,WM_KEYUP));
    // ::PostMessage(hwnd, WM_COMMAND,MAKEWPARAM(2,BN_CLICKED),NULL);//“打开”对话框 
    Sleep(110);
    hwnd=::FindWindow(NULL,"打开");
    // 1148 = 0x47C cmb13 ComboBoxEx32
    HWND hCmb13 = ::GetDlgItem(hwnd,0x047C);
    //
    if(hCmb13)
    {
    Sleep(500);
    ::SendMessage(hCmb13,WM_SETTEXT,0,(LPARAM)"abc.txt");
    }
    #endif
    }
    }
      

  6.   

    进程间的通信,你可以发送广播消息,HWND_BROADCAST