求教怎么后台向窗口发送消息 我先用findwindow找到了hwnd然后PostMessage(hwnd,WM_CHAR,'2',0);但是我用记事本来试验都无法成功键入字符 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你要键入字符要查找的不只是窗体,找到窗体以后还要找到里面的编辑框组件,用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);//这里发送消息就能在记事本的编辑框里面显示了 WM_CHAR消息并不是都支持, 有可能需要发送WM_KEYDOWN 和WM_KEYUP才行 确保找到了正确的窗口句柄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;} keybd_event()/SendInput()模拟按键~ 列子://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 } } 进程间的通信,你可以发送广播消息,HWND_BROADCAST CListBox调用Dir之后,再用GetItemDataPtr问题 怎么判断CBitmap是否已经加载了图片 每天散分40(2009-12-10 0:12:10) 怎样学MFC vs2008中ATL例子的编译问题 我的MSDN是否不全啊? 请问在98下怎么实现不规则透明窗体 那里有Borland C++3.0下载 懂汇编的都来看看,简单汇编题目(五),编写程序。元旦大派分罗!!! 请教图像边界怎样用方向链码表示? 写的MFC程序有时出现崩溃,提示可能堆被损坏,求救 问个MFC在显示窗体中无法操作窗体的问题
先通过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);//这里发送消息就能在记事本的编辑框里面显示了
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;
}
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
}
}