C# 在对SendMessageW的PInvoke调用中未找到错误\u PROC\u
我需要自动化一个第三方程序,唯一的做法是模拟点击一些按钮 我通过使用C# 在对SendMessageW的PInvoke调用中未找到错误\u PROC\u,c#,windows,pinvoke,C#,Windows,Pinvoke,我需要自动化一个第三方程序,唯一的做法是模拟点击一些按钮 我通过使用EnumChildWindows查找按钮的HWND句柄来完成此操作。当我找到“窗口”(按钮)时,我尝试使用sendmaessew发送到它。这是可行的,我的测试显示按钮确实认为它被点击了 问题出现在我的错误处理中。BM_CLICK消息没有给出任何反馈,所以我不知道它是否被点击过。我认为我应该勤奋,并检查任何错误代码,虽然与 这将返回ERROR\u PROC\u NOT\u FOUND,这并不是我希望成功处理消息的结果 我导入Sen
EnumChildWindows
查找按钮的HWND句柄来完成此操作。当我找到“窗口”(按钮)时,我尝试使用sendmaessew
发送到它。这是可行的,我的测试显示按钮确实认为它被点击了
问题出现在我的错误处理中。BM_CLICK
消息没有给出任何反馈,所以我不知道它是否被点击过。我认为我应该勤奋,并检查任何错误代码,虽然与
这将返回ERROR\u PROC\u NOT\u FOUND
,这并不是我希望成功处理消息的结果
我导入SendMessageW
,如下所示:
[DllImport("User32.dll",
CharSet = CharSet.Unicode,
CallingConvention = CallingConvention.Winapi,
SetLastError = true)]
public static extern IntPtr SendMessageW(
HandleRef hWnd,
UInt32 Msg,
UIntPtr wParam,
IntPtr lParam);
执行调用的代码是:
User32.SendMessageW(
buttonHandle,
(uint)ButtonControlMessages.BM_CLICK, // value of BM_CLICK = 0x00F5.
UIntPtr.Zero,
IntPtr.Zero);
int error = Marshal.GetLastWin32Error();
if (error != ErrorCodes.ERROR_SUCCESS) // love the name of this error code.
throw new Win32Exception(error);
我的测试只是使用一个简单的Windows窗体,附带一个按钮控件。因此,我可以通过按钮.handle
获取句柄。它被点击;这个错误是否完全无关
不过,摆脱它当然很好,我想用某种方法确保对SendMessageW
的调用至少没有失败
我使用的是Windows 7 x86-32和.NET 4。调用约定应该是
Stdcall
,但由于这是默认设置,因此您可以将其删除
我认为您的SendMessage p/Invoke看起来有点奇怪,但这可能不是问题的原因。无论如何,我会这样做:
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
我认为这里发生的情况是,SendMessage()
正在工作,但没有指定最后一个错误。唯一提到错误的是:
当UIPI阻止消息时,使用GetLastError检索的最后一个错误被设置为5(拒绝访问)
SendMessage()
的返回值取决于发送的消息。在BM_的情况下,单击显然没有发送消息。换句话说,你根本没有得到任何反馈。谢谢你的帮助,我不知道它会自动添加一个W。不幸的是,其他的改变并没有纠正它,它表现出完全相同的行为SetLastError=False
也没有区别。可能是Windows窗体做了一些奇怪的事情吗?我正在通过ReSharper xUnit runner运行测试,它在调试模式下使Marshal.FreeHGlobal
完全奇怪,所以这可能是环境造成的另一个奇怪现象。当我可以在测试之外运行这个时,我会知道更多。我已经更新了我的答案,我想我对正在发生的事情有了更好的了解。好的,谢谢,这似乎是合理的。它什么都没做,我得到一个常驻错误代码,对吗?谢谢。这是您的15个代表:)