如何在一个程序中控制另一个程序的按钮被点击!

时间:2022-06-17 19:45:43
如何在一个程序中控制另一个程序的按钮被点击!
比如,一共有两个程序,每个程序的界面上都有一个按钮,要实现的功能是,在点击其中一个程序的按钮时,控制另一个程序让,另一个程序的按钮也被点击!

13 个解决方案

#1


FindWindow(....)
SendMessage(hWnd,WM_COMMAND,..)

#2


PostMessage 
SendMessage

#3


如上面两位所说,
1、FindWindows() 根据窗口标题取得这个窗口的句柄
2、SendMessage() 发送一个按钮被单击的消息给这个窗口
这两个函数怎么用自己去查阅MSDN吧

#4


ghgk(GHGK):如果那个窗口是“无标题”的呢!!!!!!!!!

#5


可以用WindowFromPoint ()返回指定点的窗口句柄,用鼠标确定窗口位置。再获得鼠标位置通过这个函数取得该点所在的窗口句柄。

#6


那个按钮怎么会无标题呢?即使无标题也可以用""来FINDWINDOW呀

#7


edit89(烟斗丢了) 
窗口的handle不是窗口上的标题,每一个窗口都有自己唯一的标识的,操作系统就是用handle来区分窗口的
多说一句话,按纽也是一个窗口

#8


那能否做一个程序,让它在显示时,一直显示在目标程序之上,遮住目标程序。并且还能根据目标程序的改变大小和移动位置而改变。我的意思是两个程序都运行,但其中一个程序一直在另一个的上一层,使得用户看到的是这个程序,而不是底层的那个程序,底层的程序需要被完全遮住!请问各位高手,这该如何实现?

#9


可以呀,你底层的程序移动的时候发消息给上面的程序跟着一块移呀

不过底下的程序都被挡住了怎么移呀?也没必要挡住呀,隐藏不好吗?

#10


可以让上层的程序界面上一部分是透明的,一部分不透明吗?
就是说让界面上一部分透明好露出下面程序的界面!另一部分不透明显示的是上面程序的界面,这该如何实现?

#11


HWND hWnd=::FindWindow(NULL,"窗口名称")
::SendMessage(hWnd,WM_COMMAND,按钮的ID,0)

#12


学习

#13


装个钩子控制.

extern "C" _declspec (dllexport) LRESULT WINAPI HookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
static BOOL bSubClass=FALSE;//子类化标志,初始为假
if(hWnd==NULL)//如果以前未找到Notepad窗口,继续查找,找到后发送初始化消息
{
hWnd=FindWindow("Notepad",NULL);
if(IsWindow(hWnd))
PostMessage(hWnd,WM_NULL,0,0);
}
else
{
if(!IsWindow(hWnd))
{
bSubClass=FALSE;
hWnd=NULL;
}
}
//如果以前运行过Notepad,但此时已经关闭,置窗口句柄为空,子类化标志为假
if((!bSubClass)&&(nCode==HC_ACTION)&&(wParam==PM_REMOVE)&&(((MSG*)lParam)->hwnd==hWnd)&&(((MSG*)lParam)->message==WM_NULL))
{
lpOriginalProc=(WNDPROC)SetWindowLong(hWnd,GWL_WNDPROC,(LONG)NewWndSubClassProc);//设置钩子过程,进行窗口子类化
HMENU hMenu;
hMenu=GetMenu(hWnd);//获取Notepad窗口菜单
int nMenuItemCount=GetMenuItemCount(hMenu);//获得Notepad窗口菜单记数
for(int i=0;i<nMenuItemCount;i++)//遍历一级菜单
{
char lpString[128]="\0";
int nMenuItemStringLen=GetMenuString(hMenu,i,lpString,128,MF_BYPOSITION);//获取菜单标题文本
if(lstrcmp(lpString,_T("帮助(&H)"))!=0)
continue;//针对文件,编辑,格式菜单项跳过
HMENU hSubMenu=GetSubMenu(hMenu,i);//取得帮助菜单句柄
AppendMenu(hSubMenu,MF_SEPARATOR,102,"-");
AppendMenu(hSubMenu,MF_BYCOMMAND|MF_STRING,About,"关于监控");//添加菜单项,About为上面定义的枚举常数
}
DrawMenuBar(hWnd);//菜单重绘
bSubClass=TRUE;//设置子类化标志
}
return CallNextHookEx(hHook,nCode,wParam,lParam);//传递钩子到下一级钩子链
}

#1


FindWindow(....)
SendMessage(hWnd,WM_COMMAND,..)

#2


PostMessage 
SendMessage

#3


如上面两位所说,
1、FindWindows() 根据窗口标题取得这个窗口的句柄
2、SendMessage() 发送一个按钮被单击的消息给这个窗口
这两个函数怎么用自己去查阅MSDN吧

#4


ghgk(GHGK):如果那个窗口是“无标题”的呢!!!!!!!!!

#5


可以用WindowFromPoint ()返回指定点的窗口句柄,用鼠标确定窗口位置。再获得鼠标位置通过这个函数取得该点所在的窗口句柄。

#6


那个按钮怎么会无标题呢?即使无标题也可以用""来FINDWINDOW呀

#7


edit89(烟斗丢了) 
窗口的handle不是窗口上的标题,每一个窗口都有自己唯一的标识的,操作系统就是用handle来区分窗口的
多说一句话,按纽也是一个窗口

#8


那能否做一个程序,让它在显示时,一直显示在目标程序之上,遮住目标程序。并且还能根据目标程序的改变大小和移动位置而改变。我的意思是两个程序都运行,但其中一个程序一直在另一个的上一层,使得用户看到的是这个程序,而不是底层的那个程序,底层的程序需要被完全遮住!请问各位高手,这该如何实现?

#9


可以呀,你底层的程序移动的时候发消息给上面的程序跟着一块移呀

不过底下的程序都被挡住了怎么移呀?也没必要挡住呀,隐藏不好吗?

#10


可以让上层的程序界面上一部分是透明的,一部分不透明吗?
就是说让界面上一部分透明好露出下面程序的界面!另一部分不透明显示的是上面程序的界面,这该如何实现?

#11


HWND hWnd=::FindWindow(NULL,"窗口名称")
::SendMessage(hWnd,WM_COMMAND,按钮的ID,0)

#12


学习

#13


装个钩子控制.

extern "C" _declspec (dllexport) LRESULT WINAPI HookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
static BOOL bSubClass=FALSE;//子类化标志,初始为假
if(hWnd==NULL)//如果以前未找到Notepad窗口,继续查找,找到后发送初始化消息
{
hWnd=FindWindow("Notepad",NULL);
if(IsWindow(hWnd))
PostMessage(hWnd,WM_NULL,0,0);
}
else
{
if(!IsWindow(hWnd))
{
bSubClass=FALSE;
hWnd=NULL;
}
}
//如果以前运行过Notepad,但此时已经关闭,置窗口句柄为空,子类化标志为假
if((!bSubClass)&&(nCode==HC_ACTION)&&(wParam==PM_REMOVE)&&(((MSG*)lParam)->hwnd==hWnd)&&(((MSG*)lParam)->message==WM_NULL))
{
lpOriginalProc=(WNDPROC)SetWindowLong(hWnd,GWL_WNDPROC,(LONG)NewWndSubClassProc);//设置钩子过程,进行窗口子类化
HMENU hMenu;
hMenu=GetMenu(hWnd);//获取Notepad窗口菜单
int nMenuItemCount=GetMenuItemCount(hMenu);//获得Notepad窗口菜单记数
for(int i=0;i<nMenuItemCount;i++)//遍历一级菜单
{
char lpString[128]="\0";
int nMenuItemStringLen=GetMenuString(hMenu,i,lpString,128,MF_BYPOSITION);//获取菜单标题文本
if(lstrcmp(lpString,_T("帮助(&H)"))!=0)
continue;//针对文件,编辑,格式菜单项跳过
HMENU hSubMenu=GetSubMenu(hMenu,i);//取得帮助菜单句柄
AppendMenu(hSubMenu,MF_SEPARATOR,102,"-");
AppendMenu(hSubMenu,MF_BYCOMMAND|MF_STRING,About,"关于监控");//添加菜单项,About为上面定义的枚举常数
}
DrawMenuBar(hWnd);//菜单重绘
bSubClass=TRUE;//设置子类化标志
}
return CallNextHookEx(hHook,nCode,wParam,lParam);//传递钩子到下一级钩子链
}