一个老外的软件,我想通过我自己的VC程序来控制它。有办法不?比如点我程序的几个按钮,相当于点了它的对应的几个按钮。
我用FindWindow得到了它的句柄m_hWnd。然后通过句柄给它发消息。因为不知道我想要控制的那几个按钮的ID号,所以我从100到90000循环发送消息.
void CMainFrame::OnMagnifyPicture()
{
////发送一个按钮单击消息。IDcount ,我假设是ID号
while(IDcount < 90000)
{
SendMessage(WM_COMMAND,MAKEWPARAM(IDcount,BN_CLICKED),(LPARAM)m_hWnd);
IDcount++;
}
CString pi;
pi.Format("%d",IDcount);
MessageBox(pi);
MessageBox("没反应!");
}
1)发现不是没反应,就是控制了我自己的写的软件。可是明明是老外那个软件的句柄,求解?
2)这个方法没见到效果后,我用SPY++查看老外的软件,发现我要控制的那几个按钮是Class: ToolbarWindow32,Style: 5000005D,而更蛋疼的是我总共想控制6个按钮,却发现是两两一对的ToolBar图片,就更没法精确控制每一个按钮了。
不知各位有思路实现没有?
我用FindWindow得到了它的句柄m_hWnd。然后通过句柄给它发消息。因为不知道我想要控制的那几个按钮的ID号,所以我从100到90000循环发送消息.
void CMainFrame::OnMagnifyPicture()
{
////发送一个按钮单击消息。IDcount ,我假设是ID号
while(IDcount < 90000)
{
SendMessage(WM_COMMAND,MAKEWPARAM(IDcount,BN_CLICKED),(LPARAM)m_hWnd);
IDcount++;
}
CString pi;
pi.Format("%d",IDcount);
MessageBox(pi);
MessageBox("没反应!");
}
1)发现不是没反应,就是控制了我自己的写的软件。可是明明是老外那个软件的句柄,求解?
2)这个方法没见到效果后,我用SPY++查看老外的软件,发现我要控制的那几个按钮是Class: ToolbarWindow32,Style: 5000005D,而更蛋疼的是我总共想控制6个按钮,却发现是两两一对的ToolBar图片,就更没法精确控制每一个按钮了。
不知各位有思路实现没有?
解决方案 »
- 自绘CTreectrl不响应ON_NOTIFY(NM_CLICK, IDC_MYTREE, OnNMclick)消息
- 双缓冲绘图时不显示
- VC界面设计---仿vista透明界面
- 新来,散分
- 请帮忙调试一下一个简单的录音类,非常感谢!
- 写一个带界面的DLL被DELPHI调用正常,但DELPHI退出时内存非法操作,请指点.
- 非技术问题的分不能用吗?现在散1000技术分。
- 菜鸟问题
- 求教在单文档程序中动态创建WebBrowser的方法,急
- 请问这是什么错误:First-chance exception in ACRP.exe (KERNEL32.DLL): 0xC0000005: Access Violation.
- 屏幕DrawText如何清除之前
- 学生求助:为什么程序每次输出的结果不一样呢?
2、你的SendMessage实际上是this->SendMessage,你向自己发消息了,使用API就多一个参数
::SendMessage
另外问一下,EnumChildWindow里面需要用到的回调函数是系统什么时候调用的?能不能我点一个我程序里的按钮后再调用?
综上所述,如果你在按钮的事件处理程序里调用的话,回调函数就在按钮事件里调用
另外问问EnumChildWindow这个函数到底能得到些什么,我也不是很清楚。
{
if(::FindWindow(NULL, "钟表"))
{
//MessageBox("您已经打开窗口了,请关闭后再打开,谢谢!", "温馨提示!", NULL);
clockdlg.OnBnClickedCancel();
return;
}
clockdlg.WndCreate(this); //把父窗口的指针传给子窗口 }
复杂的数据设置需要通过代码注入来完成
一定有一个是实现功能的
然后直接发这个消息即可
不用模拟点击
说实话,有点晕。不过和全局钩子有点像
你说的100%成功的最靠谱的方法是不是11楼说的代码注入?
囧...
有什么消息获得TOOLBAR是个内部结构呢?
WM_NCHITTEST
WM_NOTIFY
WM_SETCURSOR
TB_GETTOOLTIPS
TB_GETITEMRECT
WM_MOUSEMOVE...
不猜ID也可以,通过枚举窗体,匹配窗体的“TEXT”,向具有这个“TEXT”标识的按钮上发消息。
例如这样://枚举子窗体(这里是广义的Window,因为Button等这样的控件也是Window,这里就是在枚举所有的控件)
EnumChildWindows(GetParent(hwnd, EnumChildProc, 0);//EnumChildWindows枚举窗体的回调
BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam)
{
TCHAR tmpWindowName[256];
GetWindowText(hwndChild,tmpWindowName,256);
if (_tcscmp(tmpWindowName,_T("确认")) == 0)
{
PostMessage(..............);
}
return TRUE;
}
EnumChildWindows(GetParent(hwnd), EnumChildProc, 0);BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam)
{
TCHAR tmpWindowName[256];
GetWindowText(hwndChild,tmpWindowName,256);
if (_tcscmp(tmpWindowName,_T("确认")) == 0)
{
PostMessage(..............);
}
return TRUE;
}
GetWindowText(hwndChild,tmpWindowName,256);
上面的子窗口句柄hwndChild如何得到?
我去枚举,没有成功...
::PostMessage(m_hWnd, WM_LBUTTONDOWN, 0, MAKELPARAM(0,0));