
貌似这个比较复杂,
第一步:找句柄。先根据窗口名字找到在下面的那个窗口的句柄,用api findwindow
第二步,放钩子。用获得的句柄给那个窗口放一个钩子,截获WM_SIZE消息,用api setwindowshook。
第三部,获得该窗口位置。截获WM_SIZE消息后,获得下面窗口的位置 , 用api getwindowrect '若果我没有记错的话,应该是这个api
第四步:调整本窗口的位置。根据上一步获得的窗口位置,调整本窗口的位置,用api setwindowslong。
第五步:将信息传回给下面窗口。WM_SIZE消息放还给下面窗口,不然下面窗口就不动了。貌似用到的api是 CallNextHookEx
最后一步:退出程序的时候不要忘记释放钩子,api UnhookWindowsHookEx
以上给个思路,api、钩子不懂的去百度下,会有很详细的解说。
其实核心是放钩子,取得下面窗口变更大小和位置时候的消息。
如果那个窗口不动的话完全可以省略放钩子的过程,直接取得窗口位置就可以了。
粗略的看了一下,最明显的就是那个CallNextHookEx不应该在else子句中调用,应该放到外面来,也就是在函数最后写上return CallNextHookEx(Hook, nCode, wParam, lParam);
你这个每当F12被按下时,CallNextHookEx就会被忽略,从而导致消息不能被传送到下一个钩子,也就不能被系统所处理。(相当于把F12屏蔽掉了)
---------------------------------------------------------------------------
要模拟键盘输入不是那么简单的,好像还应该处理WM_CHAR消息。当按下键盘后,会产生WM_KEYDOWN消息,这个谁都知道,但如果按下的是字符键,还会紧接着产生WM_KEYCHAR消息,最后才是WM_KEYUP。所以重点要在WM_CHAR上做文章。另一种思路是,把keybd_event函数换成SendMessage或PostMessage再试试,但前提是要先知道窗口句柄,囧~
f(VK_F2==wParam)
{
HWND VKWnd = GetFocus();
SendMessage(VKWnd,WM_CHAR,'9',0);
这儿改成
if(VK_F2==wParam && 1 == (lParam>>30 & 1))
{
HWND VKWnd = GetFocus();
SendMessage(VKWnd,WM_CHAR,'9',0);
}
发送两次消息的原因是,按键时会触发按下和松开两个消息。
1 == (lParam>>30 & 1)这个是用来决断当前键是否松开,这样就只会发送一次消息了,当然你也可以通过GetKeyState来判断键是按下还是松开,然后执行一次发送消息。
以上就是关于怎样让一个VB程序的窗体刚好在另一个程序的窗体上方(就是不挡住最顶上的程序)全部的内容,包括:怎样让一个VB程序的窗体刚好在另一个程序的窗体上方(就是不挡住最顶上的程序)、VC++编程键盘DLL调试不通,高手来帮忙看看啊~~~、vc 键盘钩子 拦截按键,再SendMessage,但是为何SendMessage发送两次等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)