Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在对SendMessageW的PInvoke调用中未找到错误\u PROC\u_C#_Windows_Pinvoke - Fatal编程技术网

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个代表:)