使用的User32.dll SendMessage函数发送键使用Alt修改[复制](Using Us

2019-07-04 09:30发布

可能重复:
C#和SendMessage消息(键)不工作

我写发出按键使用user32.dll中定义SendMessage函数其他应用程序的应用程序。 我已经想通了如何发送一个按键,但我难倒试图发送击键与ALT键一起。

对于我的问题的目的,我将重点放在邮寄F1和ALT + F1。

如上所述,我能够发送F1键没有问题。 这里是发送F1键的我的代码片段:

// DLL Imports

//Set the active window
[DllImport("user32.dll")]
public static extern IntPtr SetActiveWindow(IntPtr hWnd);

//sends a windows message to the specified window
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, uint wParam, uint lParam);

// ...

// Some constants
#define WM_SYSKEYDOWN 260
#define WM_SYSKEYUP 261
#define WM_CHAR 258
#define WM_KEYDOWN 256
#define WM_KEYUP 257

// ...

// activate the window and send F1
SetActiveWindow(hWnd);
ushort action = (ushort)WM_SYSKEYDOWN;
ushort key = (ushort)System.Windows.Forms.Keys.F1;
SendMessage(hWnd, action, key, 0);

一个有趣的方面值得注意的是,尽管上面的代码发送F1键到目标应用程序的工作原理是不一样的我看到使用间谍++。 这里是间谍++日志每当我打的F1键,同时监视目标应用程序的输出:

<00001> 00050412 P WM_KEYDOWN nVirtKey:VK_F1 cRepeat:1 ScanCode:3B fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00002> 00050412 P WM_KEYUP nVirtKey:VK_F1 cRepeat:1 ScanCode:3B fExtended:0 fAltDown:0 fRepeat:1 fUp:1

请注意,有送,WM_KEYDOWN和WM_KEYUP两个消息。

我的第一个问题是,为什么我成功的使用WM_SYSKEYDOWN当间谍++告诉我,WM_KEYDOWN WM_KEYUP +是正确的消息序列发送F1?

移动上的尝试发送ALT + F1我的下一个挑战。

我已经使用间谍++监测按ALT + F1时,我的键盘上,这是我看到过的消息:

<00001> 00050412 P WM_SYSKEYDOWN nVirtKey:VK_MENU cRepeat:1 ScanCode:38 fExtended:1 fAltDown:1 fRepeat:0 fUp:0
<00002> 00050412 P WM_SYSKEYDOWN nVirtKey:VK_F1 cRepeat:1 ScanCode:3B fExtended:0 fAltDown:1 fRepeat:0 fUp:0
<00003> 00050412 P WM_SYSKEYUP nVirtKey:VK_F1 cRepeat:1 ScanCode:3B fExtended:0 fAltDown:1 fRepeat:1 fUp:1
<00004> 00050412 P WM_KEYUP nVirtKey:VK_MENU cRepeat:1 ScanCode:38 fExtended:1 fAltDown:0 fRepeat:1 fUp:1

鉴于上述间谍++邮件捕获我尝试使用以下代码(简化的)发送确切的消息序列:

SetActiveWindow(hWnd);    
SendMessage(hWnd, (ushort)WM_SYSKEYDOWN, (ushort)System.Windows.Forms.Keys.Menu, 0);
SendMessage(hWnd, (ushort)WM_SYSKEYDOWN, (ushort)System.Windows.Forms.Keys.F1, 0);
SendMessage(hWnd, (ushort)WM_SYSKEYUP, (ushort)System.Windows.Forms.Keys.F1, 0);
SendMessage(hWnd, (ushort)WM_KEYUP, (ushort)System.Windows.Forms.Keys.Menu, 0);

这没有奏效。

所以这导致了我的下一个问题。 还有什么我可以尝试或者是有什么,我做错了什么?

每当我拍摄使用间谍++在这里我的程序的输出是什么记录:

<00001> 00050412 S WM_SYSKEYDOWN nVirtKey:VK_MENU cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00002> 00050412 R WM_SYSKEYDOWN
<00003> 00050412 S WM_SYSKEYDOWN nVirtKey:VK_F1 cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00004> 00050412 R WM_SYSKEYDOWN
<00005> 00050412 S WM_SYSKEYUP nVirtKey:VK_F1 cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00006> 00050412 R WM_SYSKEYUP
<00007> 00050412 S WM_KEYUP nVirtKey:VK_MENU cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00008> 00050412 R WM_KEYUP

请注意,有在行2,4,6发送额外的消息,和8 难道这是为什么事情不工作的原因吗?

我有一个关于从实际的键盘输入和那些使用我的应用程序拍摄的拍摄消息之间的差别最后一个问题。 注意cRepeat, 扫描码 ,fExtended参数 。 他们是在用我的键盘作为输入捕获的消息非零和他们在我的应用程序发送的消息都为零。 难道这是为什么我的代码不工作的原因吗? 如果是这样,我怎么修改这些值? (我假设他们来自第四个参数来SendMessage函数,这是我在所有的情况下设置为零。)

谢谢,

一月

Answer 1:

另一种解决方案。 它不会出现你递东西的WM_SYSKEYDOWN的LPARAM。 然而, 在文档 ,清楚地表明的lParam 29位需要设置以指示ALT键被按下。

ushort action = (ushort)WM_SYSKEYDOWN;
ushort key = (ushort)System.Windows.Forms.Keys.F1;
uint lparam = (0x01 << 28);
SendMessage(hWnd, action, key, lparam);


Answer 2:

我不认为SendMessage函数和WM_SYSKEYDOWN是您要使用的东西。 相反,使用SendInput功能。 如果我还记得,你很可能会通过四个输入的每个按键要模拟。 一个用于alt键的“向下”事件。 对于相应的按键另一个按下事件。 然后,每两个上的事件。

它已经有一段时间,我不得不写这样的代码,但我相信文档表明,VK_MENU是为“Alt”键的代码。



文章来源: Using User32.dll SendMessage To Send Keys With ALT Modifier [duplicate]