如果是一个别人的任意软件,它在后台运行,如何给它模拟发送键盘消息?
解决方案 »
- 纯C 这样的文件怎么读呀?
- 如何增加SwitchToView消息函数?
- 如何得到滚动窗口的滚动范围大小(用像素值表示)?
- 用vc代码编写程序,怎样识别出未读邮件的个数啊?帮帮忙吧。。。给点指点,新手来得
- DrawText显示文字的问题,求救
- 谁有最新的VC的SDK,或者最新的Wincrypt.h Crypt32.dll Crypt32.lib,高分求!诚心求!
- 请帮忙看看怎么显示不出窗口啊?
- 请问学windows编程应该先看哪本书?
- 如何捕获这样的异常
- 紧急问题,请求帮忙。
- 忽然发现CSDN回帖增加了BLOG链接,很是欣喜,散分小庆一下
- 真是奇怪了,为什么我的程序一加上AfxGetApp()->SelectPrinter("Informatik Image Driver 2.0",NULL)运行时就错?
然后GetWindowProcessID
如果窗口是你想要的进程则SendMessage即可
但用
if (pWnd!=NULL)
{
HWND hWnd=pWnd->GetSafeHwnd();
::PostMessage(hWnd,WM_CHAR,0x41,0);
}发送消息并不能被接受。
{
INPUT in;
in.type=INPUT_KEYBOARD;
in.ki.wScan=0x1e;
HWND hWnd=pWnd->GetSafeHwnd();
::SetFocus(hWnd);
SendInput(1,&in,sizeof(INPUT));
}
出现编译错误:INPUT 没有声明。但我已经有了:#include "winuser.h"被编译错误就拦住了,更不知道这个方法是否可行。请高手给出点调试过的原代码,谢谢。
#if (_WIN32_WINNT > 0x0400) // line 4281
.......
typedef struct tagKEYBDINPUT {
WORD wVk;
WORD wScan;
DWORD dwFlags;
DWORD time;
DWORD dwExtraInfo;
} KEYBDINPUT, *PKEYBDINPUT, FAR* LPKEYBDINPUT;
........
typedef struct tagINPUT {
DWORD type; union
{
MOUSEINPUT mi;
KEYBDINPUT ki;
HARDWAREINPUT hi;
};
} INPUT, *PINPUT, FAR* LPINPUT;WINUSERAPI
UINT
WINAPI
SendInput(
UINT cInputs, // number of input in the array
LPINPUT pInputs, // array of inputs
int cbSize); // sizeof(INPUT)#endif // (_WIN32_WINNT > 0x0400)
CWnd* pWnd=CWnd::FindWindow(NULL,"无标题 - 记事本");
if (pWnd!=NULL)
{
INPUT in;
in.type=INPUT_KEYBOARD;
in.ki.wScan=0x1e;
HWND hWnd=pWnd->GetSafeHwnd();
::SetFocus(hWnd);
SendInput(1,&in,sizeof(INPUT));
::PostMessage(hWnd,WM_CHAR,0x41,0);
}请用过的朋友指点。
WINUSERAPI VOID WINAPI keybd_event(
BYTE bVk,
BYTE bScan,
DWORD dwFlags,
DWORD dwExtraInfo);例如:
void SendKeyDown(CWnd* pWnd, CONST UINT uChar, CONST UINT uFlag)
{
if(IsWindow(pWnd))
{
SetForegroundWindow(pWnd)
}
::keybd_event((BYTE)uChar, (BYTE)uChar, 0, 0);
}void SendKeyUp(CWnd* pWnd, CONST UINT uChar, CONST UINT uFlag)
{
if(IsWindow(pWnd))
{
SetForegroundWindow(pWnd)
}
::keybd_event((BYTE)uChar, (BYTE)uChar, KEYEVENTF_KEYUP, 0);
}
VOID SendKey(HWND hWnd, CONST BYTE *pKey)
{
if(IsWindow(hWnd)) SetForegroundWindow(hWnd);
if(pKey)
{
int i=0;
while(pKey[i])
{
::keybd_event(pKey[i], pKey[i}, 0, 0);
i++;
}
Sleep(500);
i--;
while(i>=0)
{
::keybd_event(pKey[i], pKey[i}, KEYEVENTF_KEYUP, 0);
i--;
}
}
}
应该可以了
SendMessage 和 PostMessage 是有些区别的。
这个不行就换一个试2
你发送的消息也要换,看一下是不是消息接受到了,但你看不出效果。
比较简单的就是SendMessage(hwnd, WM_COLSE, 0, 0);
参考:《用应用程序模拟键盘和鼠标按键》配套源代码 详细信息 < 其它 > 在Windows大行其道的今天,windows界面程序受到广大用户的欢迎。对这些程序的操作不外乎两种,键盘输入控制和鼠标输入控制。有时,对于繁杂的,或重复性的输入操作,我们能否通过编制程序来代替手工输入,而用程序来模拟键盘及鼠标的输入呢?答案是肯定的。这里主要是通过两个Windows API函数来实现的。本文以 VC++为例来介绍一下如何实现这两个功能,并给出示例代码。[代码性质] VC可重用代码段
[代码作者] Owen.Guo
[文件大小] 22K
[更新日期] 2002-3-8 16:26:00
[下载次数] 2027
http://www.vckbase.com/code/relateddoc.asp?id=521
只有一个窗口线程挂接到windows平台的输入线程上,
只有那个挂接的窗口线程才能接收到消息!
你可以参考一下那本书!