___W2K服务程序中如何模拟按键___

MSVCer 2002-08-28 04:31:16
在服务程序中要向桌面上有焦点的编辑窗口中模拟键盘动作,用下面的函数已经实现了控制桌面上的鼠标
OpenWindowStation
SetProcessWindowStation
OpenInputDesktop
SetThreadDesktop
...控制鼠标

我现在想模拟按键,用keybd_event,可不行,请问大侠,这个问题该如何做??
...全文
76 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZHENG017 2002-08-30
  • 打赏
  • 举报
回复
为什么我的代码不行了?既然有焦点,只要得到edit的句柄,然后SendMessage(hwnd,WM_CHAR...).我在console方式下都可以给自己的edit真内容啊.
MSVCer 2002-08-30
  • 打赏
  • 举报
回复
大侠,帮帮我...
Upp
MSVCer 2002-08-30
  • 打赏
  • 举报
回复
问题解决了
我的代码没有问题,只要在scm中将service设置为可以与桌面交互就可以了

to ZHENG017(风中王子)
console与gui程序都是工作在"default"桌面上,service工作在另一个桌面上,是不可见的,用sendmessage解决不了问题
MSVCer 2002-08-29
  • 打赏
  • 举报
回复
CSDN竟然把我的标题中的文字修改了,可气,下面是相关的服务中操作桌面的源代码片段,哪位大侠帮忙解决啊
// LogEvent函数是自定义的日志函数
// 挂接服务线程到当前活动桌面上
HDESK hdeskCurrent;
HDESK hdesk;
HWINSTA hwinstaCurrent;
HWINSTA hwinsta;

hwinstaCurrent = GetProcessWindowStation();
if (hwinstaCurrent == NULL)
{
LogEvent(_T("\n得到本进程窗口站错误"));
return FALSE;
}

hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
if (hdeskCurrent == NULL)
{
LogEvent(_T("\n得到本线程桌面错误"));
return FALSE;
}

// 打开winsta0
hwinsta = OpenWindowStation((LPTSTR)"winsta0", FALSE,
WINSTA_ACCESSCLIPBOARD |
WINSTA_ACCESSGLOBALATOMS |
WINSTA_CREATEDESKTOP |
WINSTA_ENUMDESKTOPS |
WINSTA_ENUMERATE |
WINSTA_EXITWINDOWS |
WINSTA_READATTRIBUTES |
WINSTA_READSCREEN |
WINSTA_WRITEATTRIBUTES);
if (hwinsta == NULL)
{
LogEvent(_T("\n打开窗口站错误"));

return FALSE;
}

if (!SetProcessWindowStation(hwinsta))
{
LogEvent(_T("挂接窗口站错误"));

return FALSE;
}

// 打开desktop
hdesk = OpenInputDesktop(
0,
FALSE,
DESKTOP_CREATEMENU |
DESKTOP_CREATEWINDOW |
DESKTOP_ENUMERATE |
DESKTOP_HOOKCONTROL |
DESKTOP_JOURNALPLAYBACK |
DESKTOP_JOURNALRECORD |
DESKTOP_READOBJECTS |
DESKTOP_SWITCHDESKTOP |
DESKTOP_WRITEOBJECTS);
if (hdesk == NULL)
{
LogEvent(_T("\n打开桌面错误"));

return FALSE;
}

SetThreadDesktop( hdesk );

// 模拟按键输出,失败,请大侠分析一下失败原因及解决办法好吗?==========<<<<<<<<<<<
for(int i=0;i<20;i++)
{
INPUT input[2];
memset(input, 0, sizeof(input));
input[0].type = input[1].type = INPUT_KEYBOARD;
input[0].ki.wVk = input[1].ki.wVk = 0xF6;
input[1].ki.dwFlags = KEYEVENTF_KEYUP;
input[0].ki.time = input[1].ki.time = GetTickCount();
SendInput(2, input, sizeof(INPUT));

Sleep(50);

::MessageBeep( -1 );
}

// 演示控制桌面上的鼠标,成功
/*
for(int i=0;i<20;i++)
{
::Sleep(500);
::SetCursorPos( 100, 100 );

::MessageBeep( -1 );
}
*/

if (!SetProcessWindowStation(hwinstaCurrent))
return FALSE;

if (!SetThreadDesktop(hdeskCurrent))
return FALSE;

if (!CloseWindowStation(hwinsta))
return FALSE;

if (!CloseDesktop(hdesk))
return FALSE;
MSVCer 2002-08-29
  • 打赏
  • 举报
回复
to In355Hz(好象一条狗)
在服务程序中使用sendinput如下,仍无法输出按键 :(

INPUT input[2];
memset(input, 0, sizeof(input));
input[0].type = input[1].type = INPUT_KEYBOARD;
input[0].ki.wVk = input[1].ki.wVk = 0xF6;
input[1].ki.dwFlags = KEYEVENTF_KEYUP;
input[0].ki.time = input[1].ki.time = GetTickCount();
SendInput(2, input, sizeof(INPUT));
ttzzgg_80713 2002-08-29
  • 打赏
  • 举报
回复
用OpenDesktop加上
hdesk = OpenDesktop(LPTSTR)"winsta0", 0, FALSE, MAXIMUM_ALLOWED);
试试呢?

SetThreadDesktop的hdesk是应用另外的方法得来吧???
MSVCer 2002-08-29
  • 打赏
  • 举报
回复
Upp------------------------------------------ :(
ttzzgg_80713 2002-08-29
  • 打赏
  • 举报
回复
我觉的是不是下面的两个原因。
The current desktop is not the active desktop
or
The foreground thread belongs to another process and the desktop does not allow the hook or the journal record.
Flysnow 2002-08-29
  • 打赏
  • 举报
回复
up up
ZHENG017 2002-08-29
  • 打赏
  • 举报
回复
HWND hwnd=::FindWindowEx(...)
char text[]="pretty pretty gril";
for (int i=0;i<strlen(text);i++)
::PostMessage(hwnd,WM_CHAR,text[i],NULL);
LeoKing 2002-08-29
  • 打赏
  • 举报
回复
gz
mahongxi 2002-08-29
  • 打赏
  • 举报
回复
只能说:关注
MSVCer 2002-08-29
  • 打赏
  • 举报
回复
有路过的来帮忙UP一下吧,please
In355Hz 2002-08-28
  • 打赏
  • 举报
回复
用SendInput函数试试?
philis 2002-08-28
  • 打赏
  • 举报
回复
帮忙踢一脚。
MSVCer 2002-08-28
  • 打赏
  • 举报
回复
在服务程序中这样不行
realdreamer 2002-08-28
  • 打赏
  • 举报
回复
void main()
{
Sleep(5000);
for (BYTE i='A'; i<='Z'; i++)
{
keybd_event( (BYTE)i, 0, 0, 0);
keybd_event( (BYTE)i, KEYEVENTF_KEYUP, 0, 0 );

Sleep(50);
}

}
MSVCer 2002-08-28
  • 打赏
  • 举报
回复
自己关注。。。

16,471

社区成员

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

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

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