C# 用c语言将鼠标左键单击发送到sopcast静音按钮#
我试图用c#将鼠标左键单击发送到sopcast静音按钮,但没有结果。 以下是我所做的:C# 用c语言将鼠标左键单击发送到sopcast静音按钮#,c#,C#,我试图用c#将鼠标左键单击发送到sopcast静音按钮,但没有结果。 以下是我所做的: const int BN_CLICKED = 245; public static void mute_sopcast() { IntPtr hwnd = FindWindow("#32770", null); IntPtr chwnd1 = FindWindowEx(hwnd, IntPtr.Zero, "AfxOleControl70su", null); Int
const int BN_CLICKED = 245;
public static void mute_sopcast()
{
IntPtr hwnd = FindWindow("#32770", null);
IntPtr chwnd1 = FindWindowEx(hwnd, IntPtr.Zero, "AfxOleControl70su", null);
IntPtr chwnd2 = FindWindowEx(chwnd1, IntPtr.Zero, "#32770", null);
IntPtr chwnd3 = FindWindowEx(chwnd2, IntPtr.Zero, "Button", "Mute");
PostMessage(chwnd3, BN_CLICKED, 0, (int)IntPtr.Zero);
//The code bellow I made it to see if chwnd… is zero or not.
if (chwnd3 == new IntPtr(0))
{
MessageBox.Show("IntPtr(0)");
}
else if (chwnd3 == IntPtr.Zero)
{
MessageBox.Show("IntPtr.Zero");
}
else
{
MessageBox.Show("IntPtr.Zero not empty");
}
}
Winspector Spy给了我这个:
000E036E: #32770
…
00070406: AfxOleControl70su
002C06A2: #32770
…
000F03A4: Button “Mute”
000E036E:#32770
…
00070406:AfxOleControl70su
002C06A2:#32770
…
000F03A4:按钮“静音”
有人能告诉我哪里错了吗?
非常感谢。您是否尝试过:
SendMessage(chwnd4, WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero);
SendMessage(chwnd4, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);
不是窗口消息-它是作为WM_命令消息的WPARAM
的一部分发送的通知代码。WM_命令消息还需要外部无法使用的控件ID。WM_命令消息也会发送到控件的父窗口,而不是控件本身
发送此信息的正确方式是:
const int WM_COMMAND = 0x111;
const int BN_CLICKED = 245;
int controlID = ??; // Something you don't know
int wParam = BN_CLICKED >> 16 | controlID;
PostMessage(chwnd3, WM_COMMAND, wParam , (int)chwnd4);
当然,这假设代码使用的是WM_命令消息,而不是直接侦听按钮上/下消息
更好的选择是将焦点设置到按钮,然后向USE发送空格键以执行按钮单击。使用系统
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace automouse
{
public partial class Form1 : Form
{
public const int WM_LBUTTONDOWN = 0x0201;
public const int WM_LBUTTONUP = 0x0202;
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
SendMessage(button2.Handle, WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero);
SendMessage(button2.Handle, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);
}
private void button2_Click(object sender, EventArgs e)
{
MessageBox.Show("Button2 clicked!");
}
}
}
是的。此外,BN_CLICKED会发送(未发布)给按钮的所有者。用BM_点击修复所有问题。我将代码改成了这个,但没有结果:const int WM_COMMAND=0x111;const int BN_=245;int controlID=10006;//我从ID行中的000F03A4:按钮“静音”的Winspector Spy的属性窗口中获取此值。int wParam=BN_单击>>16|controlID;PostMessage(chwnd3,WM_命令,wParam,(int)chwnd4);我认为问题出在这行“IntPtr chwnd4=FindWindowEx(chwnd3,IntPtr.Zero,“Button”,“Mute”);”中,因为我得到了消息“IntPtr(0)”。在我看来,我应该有消息“IntPtr not empty”,这个例子对我来说也不适用。问题是我找不到一个方法来握住这个按钮的把手。有人能告诉我在这种情况下怎么做吗?Chwnd3为零是不好的。也许你应该检查hwnd,其他的也不是零。然后在最后一个非零的窗口上使用EnumChildWindows,以查看为什么无法按类和名称找到它