一个程序怎么接受窗口外的操作信息,比如在一个程序窗口按下某个键, 30
1个回答
展开全部
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);
}
非常感谢,你的最完美了,反正也没别的办法后台发送消息到窗口。
线程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);
}
非常感谢,你的最完美了,反正也没别的办法后台发送消息到窗口。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询