C# 带有shift、control、alt组合键的sendmessage

C# 带有shift、control、alt组合键的sendmessage,c#,.net,winapi,keyboard,C#,.net,Winapi,Keyboard,我正在尝试发送组合键,如⇧按Shift+F8等键切换到特定窗口。我可以通过设置一个WM_KEYDOWN,然后设置一个WM_keydup,并将(int)System.Windows.Forms.Keys.F8指定为wParam,来发送F8,但我不知道如何使用shift键。我尝试过用System.Windows.Forms.Keys.SHIFT以及System.Windows.Forms.Keys.SHIFTKEY对其进行ORing,但似乎不起作用。还有别的办法吗 请注意,我不能使用SendInpu

我正在尝试发送组合键,如⇧按Shift+F8等键切换到特定窗口。我可以通过设置一个
WM_KEYDOWN
,然后设置一个
WM_keydup
,并将
(int)System.Windows.Forms.Keys.F8
指定为
wParam
,来发送F8,但我不知道如何使用shift键。我尝试过用
System.Windows.Forms.Keys.SHIFT
以及
System.Windows.Forms.Keys.SHIFTKEY
对其进行ORing,但似乎不起作用。还有别的办法吗


请注意,我不能使用
SendInput
,或者可能是因为它们不带窗口句柄,并且我的窗口可能不在前台。欢迎任何建议…

发送个人
WM\u KEYDOWN
消息,每个按键一条

按下时,以下是Spy++捕获的消息序列⇧在记事本中按住Shift+F8键

由于windows处理修改键的方式(有趣,是吗?),您必须使用或
SendInput
将修改键发送到另一个应用程序。我认为两者都可能需要另一个应用程序具有正确工作的焦点


仅仅发送一系列按键/向上键,就好像你在按住修改键一样(或者,至少,我没有持续尝试过)不起作用,因为大多数应用程序都会单独轮询这些键,而不是侦听关于它们的消息。我想如果您控制两个应用程序的源代码,这可能会起作用。

是的,消息会被发送,但它们并不重要。大多数应用程序使用
GetKeyState
检查修改键,它们的消息不会影响返回的内容。这是wierd。我正是这样做的,但它仍然不起作用。如果我使用Spy++捕获我正在发送的WM_KEYDOWN和WM_keydup消息,并捕获从SHIFT F8按键生成的消息,它们看起来完全相同,正如您上面所述,但由于某些原因,应用程序没有响应我正在发送的消息。@Jeremy,@Donnie的观点是正确的。为VK_SHIFT发送WM_KEYDOWN/WM_keydup对不会影响实际的密钥状态,因此如果应用程序使用GetKeyState,这将不起作用。GetKeyState的文档可能会被读取,以暗示状态已被WM_密钥消息修改。实际上,似乎整个键盘状态的快照与每个(真实的)WM_KEYxxx消息一起存储:主要是因为WM_KEY消息只包括VK_控件,但GetKeyState将返回VK_LCONTROL或VK_RCONTROL的状态,如果它使用实际消息中的数据,则无法获得这些信息。一个有趣的问题是,如果我们手动发布WM_KEYxxx消息,GetKeyState实际访问的键状态是什么?
WM_KEYDOWN -> Shift

WM_KEYDOWN -> F8

WM_KEYUP   -> F8

WM_KEYUP   -> Shift
WM_KEYDOWN nVirtKey:VK_SHIFT cRepeat:1 ScanCode:36 fExtended:0 fAltDown:0 fRepeat:0 fUp:0

WM_KEYDOWN nVirtKey:VK_F8 cRepeat:1 ScanCode:42 fExtended:0 fAltDown:0 fRepeat:0 fUp:0

WM_KEYUP nVirtKey:VK_F8 cRepeat:1 ScanCode:42 fExtended:0 fAltDown:0 fRepeat:1 fUp:1

WM_KEYUP nVirtKey:VK_SHIFT cRepeat:1 ScanCode:36 fExtended:0 fAltDown:0 fRepeat:1 fUp:1