一个程序怎么接受窗口外的操作信息,比如在一个程序窗口按下某个键, 30

一个程序怎么接受窗口外的操作信息,比如在一个程序窗口按下某个键,然后会触发另一个程序放音乐... 一个程序怎么接受窗口外的操作信息,比如在一个程序窗口按下某个键,然后会触发另一个程序放音乐 展开
 我来答
lilipat
高粉答主

2017-04-27 · 每个回答都超有意思的
知道大有可为答主
回答量:3万
采纳率:94%
帮助的人:4978万
展开全部
VC怎样向另一个程序窗口发送组合键消息,比如“ALT+F"
线程menuvc组合键
我在网上搜了老半天了,

PostThreadMessage(tID, WM_KEYDOWN, VK_F9, 0);这个方法只能发给线程,窗口收不到消息。

下面这个在网上说可以输出”ALT+F"的组合键,但我那个窗口只收到“F" 的键。
HWND hWnd = pWnd->m_hWnd;
::PostMessage(hWnd, WM_SYSKEYDOWN, 0x46, 1 << 29);

还有下面这个也不行:(只能收到”F"信息)
pWnd->PostMessage(WM_SYSKEYDOWN, VK_MENU);//按下ALT
pWnd->PostMessage(WM_SYSKEYDOWN, 'F');
pWnd->PostMessage(WM_SYSKEYUP, 'F');
pWnd->PostMessage(WM_SYSKEYUP, VK_MENU);//放开ALT
-------------------------------------------
哪位大神帮帮我,非常感谢。

keybd_event和”MakeKeyLparam“ 都能打开 ”另存为“对话框 ,但接下来对 ”另存为“ 的操作都一点反应也没有。不知什么回事,有什么办法对”另存为“的对话框操作也有反应?
谢谢 !
这两种方法都要用到” pWnd->ActivateTopParent(); “,,,,否则没反应。
为什么没反应,原因找到了,就是在显示对话框后 要加个”sleep(1000)",接下来的模拟就有反应了。

那么问题又来了,怎样才能在“文件名”后的编辑框里输入内容呢?“类名”是Edit,,,,,,,,虽然模拟“Alt+N"可以,但不知道句柄之类的办法输入内容。

keybd_event 挺好用的

C/C++ code?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

#define doKeyEvent(key, bUp, bExt) \
do{ \
BYTE vsc = MapVirtualKey(key, MAPVK_VK_TO_VSC); \
DWORD flag = ((bExt)? KEYEVENTF_EXTENDEDKEY:0)|((bUp)? KEYEVENTF_KEYUP:0); \
keybd_event(key, vsc, flag, 0); \
Sleep(10); \
}while(0);
#define doKeyClick(key, bExt) \
do \
{ \
doKeyEvent(key, 0, bExt); \
doKeyEvent(key, 1, bExt); \
}while(0);

DWORD __stdcall SimKeyboSave(LPVOID lParam)
{
HWND hWnd = (HWND)lParam;
SetForegroundWindow(hWnd);

//Ctrl+S save
doKeyEvent(VK_CONTROL, 0, 1);
doKeyClick('S', 0);
doKeyEvent(VK_CONTROL, 1, 1);

//wait for dialog init
Sleep(5000);

//Ctrl+A select All
doKeyEvent(VK_CONTROL, 0, 1);
doKeyClick('A', 0);
doKeyEvent(VK_CONTROL, 1, 1);

//delete select string
doKeyClick(VK_DELETE, 0);

//enter new string abc.txt
doKeyClick('A', 0);
doKeyClick('B', 0);
doKeyClick('C', 0);
doKeyClick(VK_OEM_PERIOD, 0);
doKeyClick('T', 0);
doKeyClick('X', 0);
doKeyClick('T', 0);

//enter return
doKeyClick(VK_RETURN, 0);

return 0;
}

void CMainFrame::OnTest()
{
// TODO: 在此添加命令处理程序代码

CWnd *pWnd = AfxGetMainWnd();
HANDLE hThread = CreateThread(NULL, 0, SimKeyboSave, m_hWnd, 0, NULL);
CloseHandle(hThread);
}

非常感谢,你的最完美了,反正也没别的办法后台发送消息到窗口。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式