keybd_event会黑屏,为什么?

Kuntakimp 2009-02-09 01:58:41
1。连续N次调用mouse_event 或者是keybd_event会出现黑屏,为什么?

2。
mouse_event是发送一个按键message给操作系统,照理说,每一个mouse_event发送的消息都一定会在程序运行结束前处理
可是事实上,如果N次调用的话,中间的某些次数可能会遗漏,这是怎么回事?

3。如果在mouse_event之间插入sleep(100)的时候,黑屏不能改善,但是可以使得每个mouse_event发送之消息均被处理,那么如此的话,会花费很多时间(因为不断的要Sleep),有没有办法改进?

...全文
138 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kuntakimp 2009-02-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 cnzdgs 的回复:]
INPUT结构中很多成员都没有初始化。不过这似乎也不会导致黑屏,你模拟输入是在控制什么?
[/Quote]

就是控制键盘刷新网页
cnzdgs 2009-02-19
  • 打赏
  • 举报
回复
INPUT结构中很多成员都没有初始化。不过这似乎也不会导致黑屏,你模拟输入是在控制什么?
Kuntakimp 2009-02-18
  • 打赏
  • 举报
回复
up
Kuntakimp 2009-02-09
  • 打赏
  • 举报
回复
::SetCursorPos(164,372);
::RightClick();//in opera's page
Sleep(40);
::SetCursorPos(261,644);
::LftClick();
Sleep(40);
::SetCursorPos(312,200);
::LftClick();
Sleep(40);

::SetCursorPos(679,393);

for(int i=0;i<50;i++){
::LftClick();
Sleep(40);
}

::SetCursorPos(505,522);
::LftClick();
Sleep(100);
Kuntakimp 2009-02-09
  • 打赏
  • 举报
回复
@rdsnow
可是进程已经结束了,应该是等处理完毕后进程才结束,程序才退出吧?

2。那么两对keyup+keydown之间要不要sleep呢?
rdsnow 2009-02-09
  • 打赏
  • 举报
回复
是不是消息发送的太快了!系统来不及处理!导致消息队伍排的太长吧!


另外 keyup 和 keydown 之间 sleep(100)!!!这点时间还是要的!
cnzdgs 2009-02-09
  • 打赏
  • 举报
回复
贴代码看看。
dch4890164 2009-02-09
  • 打赏
  • 举报
回复
画图事件是自己处理的,黑屏应当是DC的问题,应当是你的程序自己画上去的,和键盘的关系不大或者说你对键盘的响应方式有误
=========================================================
还有你需要什么键盘响应需要这么快,竟然100ms都不能满足你的要求,是不是方案上有纰漏
至少键盘的扫描周期在那里呢 ,正常的程序,你通过按键盘让他不断地响应该事件也能把程序阻塞住
个人认为你对键盘的这种处理方式是很不适当的
======================================================================
另外对于mouse_event的处理,你的是ce系统嘛?
正常情况下应用程序也是无法捕捉到所有的鼠标事件的,如果想捕获所有的鼠标事件必须通过SetCapture类函数
但是过高的频率使用mouse_event显然也是非常不恰当的,因为频率高响应也高,不但会影响操作系统的性能,实时性也会下降
如果真是ce系统,那么引起的内存碎片也是个麻烦
总体上看,不管你是什么样的应用主要问题不是出在mouse_event或者keybd_event上,你的方案应当是有问题的
纯粹是个人意见
Kuntakimp 2009-02-09
  • 打赏
  • 举报
回复
最好是解释原因,而不要推荐另一个API
据我所知,SendInput问题多多
蒋晟 2009-02-09
  • 打赏
  • 举报
回复
用SendInput
Kuntakimp 2009-02-09
  • 打赏
  • 举报
回复
void LftClick()
{
INPUT input[2];
input[0].type=input[1].type=INPUT_MOUSE;
input[0].mi.dwFlags=MOUSEEVENTF_LEFTDOWN;
input[1].mi.dwFlags=MOUSEEVENTF_LEFTUP;
SendInput(2,input,sizeof(input[0]));



}
void RightClick(){

INPUT input[2];
input[0].type=input[1].type=INPUT_MOUSE;
input[0].mi.dwFlags=MOUSEEVENTF_RIGHTDOWN;
input[1].mi.dwFlags=MOUSEEVENTF_RIGHTUP;
SendInput(2,input,sizeof(input[0]));
}


cnzdgs 2009-02-09
  • 打赏
  • 举报
回复
LftClick里面是怎么写的?
另外Sleep(40)太短,建议先设置大一些,给程序留出足够的响应时间,不过这应该不是导致黑屏的原因。

16,472

社区成员

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

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

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