C# 用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

我试图用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); 
    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,以查看为什么无法按类和名称找到它