如何用windows服务程序模拟鼠标动作

鯎鯎 2013-01-18 12:09:14
我要在windows上加上一个电阻触摸屏。通过点击触摸屏,有一芯片把数据处理了,直接以串口把点击坐标发到PC串口上。
由于是触摸屏,所以,我想在系统开启时,就启动,而且不想被用户通过任务管理器关闭程序,所以打算用服务程序完成对串口数据的处理和鼠标动作的模拟。

我在网上找到一个API是产生鼠标动作的,叫SendInput,我也在普通程序上测试过,但是问题也出来了。当我把SendInput函数在服务程序运行时,发现,鼠标根本没有动静。本来以为是服务程序写的不对,后来加入了,对文件写的操作,发现文件已被写入了,但鼠标依旧没反应。
后来又查了一次SendInput函数,MSDN上写着,only for desktop apps。

不知道有没有高手告诉我,如何解决这问题!
...全文
372 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
Saleayas 2014-08-21
  • 打赏
  • 举报
回复
desktop apps only 表示 metro 不能用。 和你的服务有什么关系呢?
自由航标 2014-08-21
  • 打赏
  • 举报
回复
引用 20 楼 scutth 的回复:
[quote=引用 19 楼 bakasen 的回复:] [quote=引用 18 楼 scutth 的回复:] 撸主,请问你在Service中调用SendInput的问题解决了吗?我现在跟你一样的问题。。
解決不了,试了N钟方法都不行,如果你找到方法了,告诉我一声,先谢谢了。[/quote] 这个问题基本已经弄清楚了。 从Windows Vista开始,出于安全的考虑,在User Mode Driver和Service中无法向外传递Windows消息。 给我你邮箱,可以给你发一份的微软的文档,里面有详细解释,相关内容也可以在MSDN上查到,戳这里。 或者你自己搜一下Session 0 隔离。[/quote] 我发现在XP也是不行的 我已经设置了与桌面交互 我的方式是在服务里调用自己写的一个DLL ,DLL再通过自己写的驱动程序来操作鼠标 写成桌面程序就完全OK 但现在写到服务里就不行 还请大家帮忙~~谢谢
自由航标 2014-08-21
  • 打赏
  • 举报
回复
楼主你的问题解决了吗
scutth 2013-05-31
  • 打赏
  • 举报
回复
要不然你可以这样实现你的功能: 由Service创建一个后台进程,这个进程是个普通的Desktop Application,Service在获取数据以后通过IPC传递给后台进程,由后台进程负责模拟鼠标和键盘消息,这条路是可以走通的。只是实现起来略微麻烦,因为需要创建后台进程,需要IPC等等。
scutth 2013-05-31
  • 打赏
  • 举报
回复
引用 19 楼 bakasen 的回复:
[quote=引用 18 楼 scutth 的回复:] 撸主,请问你在Service中调用SendInput的问题解决了吗?我现在跟你一样的问题。。
解決不了,试了N钟方法都不行,如果你找到方法了,告诉我一声,先谢谢了。[/quote] 这个问题基本已经弄清楚了。 从Windows Vista开始,出于安全的考虑,在User Mode Driver和Service中无法向外传递Windows消息。 给我你邮箱,可以给你发一份的微软的文档,里面有详细解释,相关内容也可以在MSDN上查到,戳这里。 或者你自己搜一下Session 0 隔离。
鯎鯎 2013-05-24
  • 打赏
  • 举报
回复
引用 18 楼 scutth 的回复:
撸主,请问你在Service中调用SendInput的问题解决了吗?我现在跟你一样的问题。。
解決不了,试了N钟方法都不行,如果你找到方法了,告诉我一声,先谢谢了。
scutth 2013-05-08
  • 打赏
  • 举报
回复
撸主,请问你在Service中调用SendInput的问题解决了吗?我现在跟你一样的问题。。
jimette 2013-01-18
  • 打赏
  • 举报
回复
鯎鯎 2013-01-18
  • 打赏
  • 举报
回复
引用 16 楼 jason_wentzel 的回复:
75888516@qq.com,发邮箱里,晚上帮你看看
谢谢!!!
孤客天涯 2013-01-18
  • 打赏
  • 举报
回复
75888516@qq.com,发邮箱里,晚上帮你看看
鯎鯎 2013-01-18
  • 打赏
  • 举报
回复
引用 11 楼 jason_wentzel 的回复:
给你一个函数,调用:SelectDesktop("default"); BOOL SelectDesktop(char *name) { HDESK desktop; if (name != NULL) { // Attempt to open the named desktop desktop = OpenDesktop(name, 0, FALSE,……
由于没找到IsWinNT,IsWin2kK,我就先把那个注释了。 我试了, 在ServiceMain里,启动服务前,调用了SelectDesktop; 也在ServiceMain创建的线程调用SelectDesktop,但鼠标还是没反应。 因为从来没搞过服务程序,有很多不懂。 可以帮我看看代码吗?可以留个Email,QQ之类的吗?
鯎鯎 2013-01-18
  • 打赏
  • 举报
回复
引用 12 楼 jason_wentzel 的回复:
BOOL SelectHDESK(HDESK new_desktop) { // Are we running on NT? if (IsWinNT() || IsWin2K() ) { HDESK old_desktop = GetThreadDesktop(GetCurrentThreadId()); if(old_desktop) { DWORD d……
IsWinNT , IsWin2K 没找到。。。
鯎鯎 2013-01-18
  • 打赏
  • 举报
回复
引用 11 楼 jason_wentzel 的回复:
给你一个函数,调用:SelectDesktop("default"); BOOL SelectDesktop(char *name) { HDESK desktop; if (name != NULL) { // Attempt to open the named desktop desktop = OpenDesktop(name, 0, FALSE,……
要在services 入口函数调用?
孤客天涯 2013-01-18
  • 打赏
  • 举报
回复
BOOL SelectHDESK(HDESK new_desktop)
{
// Are we running on NT?
if (IsWinNT() || IsWin2K() )
{
HDESK old_desktop = GetThreadDesktop(GetCurrentThreadId());
if(old_desktop)
{
DWORD dummy;
char new_name[256];

if (!GetUserObjectInformation(new_desktop, UOI_NAME, &new_name, 256, &dummy))
{
return FALSE;
}

// Switch the desktop
if(!SetThreadDesktop(new_desktop))
{
return FALSE;
}

// Switched successfully - destroy the old desktop
CloseDesktop(old_desktop);
return TRUE;
}
else
{
return FALSE;
}
}
return FALSE;
}
孤客天涯 2013-01-18
  • 打赏
  • 举报
回复
给你一个函数,调用:SelectDesktop("default");
BOOL SelectDesktop(char *name)
{
HDESK desktop;

if (name != NULL)
{
// Attempt to open the named desktop
desktop = OpenDesktop(name, 0, FALSE,
DESKTOP_CREATEMENU |
DESKTOP_CREATEWINDOW |
DESKTOP_ENUMERATE |
DESKTOP_HOOKCONTROL |
DESKTOP_WRITEOBJECTS |
DESKTOP_READOBJECTS |
DESKTOP_SWITCHDESKTOP |
GENERIC_WRITE);
}
else
{
// No, so open the input desktop
desktop = OpenInputDesktop(0, FALSE,
DESKTOP_CREATEMENU |
DESKTOP_CREATEWINDOW |
DESKTOP_ENUMERATE |
DESKTOP_HOOKCONTROL |
DESKTOP_WRITEOBJECTS |
DESKTOP_READOBJECTS |
DESKTOP_SWITCHDESKTOP |
GENERIC_WRITE);
}

// Did we succeed?
if (desktop == NULL)
{
return FALSE;
}

// Switch to the new desktop
if (!SelectHDESK(desktop))
{
// Failed to enter the new desktop, so free it!
CloseDesktop(desktop);
return FALSE;
}

// We successfully switched desktops!
return TRUE;
}
鯎鯎 2013-01-18
  • 打赏
  • 举报
回复
引用 9 楼 jason_wentzel 的回复:
不应该呀,你服务程序切换到了用户桌面不?服务默认是运行在Winlogon桌面下,要切换到default桌面
如何切换到default桌面?
孤客天涯 2013-01-18
  • 打赏
  • 举报
回复
不应该呀,你服务程序切换到了用户桌面不?服务默认是运行在Winlogon桌面下,要切换到default桌面
鯎鯎 2013-01-18
  • 打赏
  • 举报
回复
引用 7 楼 jason_wentzel 的回复:
创建服务时指定与桌面交互属性SERVICE_INTERACTIVE_PROCESS就可以了,不需要手动设置
试了,还是不行。。。。。鼠标一点反应都没,文件却被写了。。
孤客天涯 2013-01-18
  • 打赏
  • 举报
回复
创建服务时指定与桌面交互属性SERVICE_INTERACTIVE_PROCESS就可以了,不需要手动设置
鯎鯎 2013-01-18
  • 打赏
  • 举报
回复
引用 5 楼 jason_wentzel 的回复:
你服务程序有没有设置与桌交互?
已经设置了,但是后期手动设置,难道要重启电脑?
加载更多回复(4)

16,472

社区成员

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

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

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