求教怎么后台向窗口发送消息

a735147264 2018-02-12 02:14:51
我先用findwindow找到了hwnd然后PostMessage(hwnd,WM_CHAR,'2',0);
但是我用记事本来试验都无法成功键入字符
...全文
811 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
luckyboy1979 2018-02-23
  • 打赏
  • 举报
回复
进程间的通信,你可以发送广播消息,HWND_BROADCAST
schlafenhamster 2018-02-22
  • 打赏
  • 举报
回复
列子:

//
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
	}	
}
Eleven 2018-02-21
  • 打赏
  • 举报
回复
keybd_event()/SendInput()模拟按键~
zgl7903 2018-02-12
  • 打赏
  • 举报
回复
确保找到了正确的窗口句柄

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;
}  
xiaohuh421 2018-02-12
  • 打赏
  • 举报
回复
WM_CHAR消息并不是都支持, 有可能需要发送WM_KEYDOWN 和WM_KEYUP才行
oyljerry 2018-02-12
  • 打赏
  • 举报
回复
要找到对应的输入文本的窗口句柄,然后就是有些窗口并不支持你发送的消息也显示不出来
gspUser 2018-02-12
  • 打赏
  • 举报
回复
你要键入字符要查找的不只是窗体,找到窗体以后还要找到里面的编辑框组件,用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);//这里发送消息就能在记事本的编辑框里面显示了

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧