2 qq 32857097 qq_32857097 于 2016.03.08 11:41 提问

C#如何获取计算器按钮1的句柄,并进行点击操作,请教一下 谢谢
c#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Threading;

namespace ConsoleApplication1
{
class Program
{
[DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", EntryPoint = "FindWindowEx", CharSet = CharSet.Auto)]
extern static IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam);

    [STAThread]
    static void Main(string[] args)
    {
        string path = "C:\\WINDOWS\\system32\\calc.exe";
        Process p = Process.Start(path);
        if (p == null)
            Console.WriteLine("Warning:process may already exist");


        Console.WriteLine("Finding main window handle");
        IntPtr mainWindows = FindMainWindowHandle("计算器", 100, 25);
        Console.WriteLine("Handle to main window is " + mainWindows);

        //有名字控件句柄
        Console.WriteLine("Findding handle to button1");
        IntPtr butt = FindWindowEx(mainWindows, IntPtr.Zero, null, "Backspace");//这里的1是,计算器上名字为1的按钮
        if (butt == IntPtr.Zero)

            throw new Exception("Unable to find button1");

        else
            Console.WriteLine("Handle to button1 is " + butt);
        SendMessage(mainWindows, 0X101, butt, null);


        //没有名字或者重名控件
        //Console.WriteLine("Findding handle to listbox1");
        //IntPtr lb = FindWindowByIndex(mwh, 3);
        //if (lb == IntPtr.Zero)
        //    throw new Exception("Unable to find listbox1");
        //else
        //    Console.WriteLine("Handle to listbox1 is " + lb);

    }

    //通过索引查找相应控件句柄
    static IntPtr FindWindowByIndex(IntPtr hwndParent, int index)
    {
        if (index == 0)
        {
            return hwndParent;
        }
        else
        {
            int ct = 0;
            IntPtr result = IntPtr.Zero;
            do
            {
                result = FindWindowEx(hwndParent, result, null, null);
                if (result != IntPtr.Zero)
                {
                    ++ct;
                }
            } while (ct < index && result != IntPtr.Zero);
            return result;
        }
    }

    //获得待测程序主窗体句柄
    private static IntPtr FindMainWindowHandle(string caption, int delay, int maxTries)
    {
        IntPtr mwh = IntPtr.Zero;
        bool formFound = false;
        int attempts = 0;
        while (!formFound && attempts < maxTries)
        {
            if (mwh == IntPtr.Zero)
            {
                Console.WriteLine("Form not yet found");
                Thread.Sleep(delay);
                ++attempts;
                mwh = FindWindow(null, caption);
            }
            else
            {
                Console.WriteLine("Form has been found");
                formFound = true;
            }
        }

        if (mwh == IntPtr.Zero)
            throw new Exception("Could not find main window");
        else
            return mwh;
    }
}

}

2个回答

caozhy
caozhy   Ds   Rxr 2016.03.08 11:45

你用spy++看下控件id,直接用getdlgitem不需要findwindow

qq_32857097
qq_32857097   2016.03.08 11:49

spy++每次运行获取的句柄都不一样 每次都会变化 所以犯难了~

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
收集的部分C#中窗口句柄及操作
 声明:引用的API函数一定要放在窗体里面!!! 1. c#里FindWindow的用法 FindWindow()函数的用法。要在C#里使用该API,写出FindWindow()函数的声明:             [DllImport("coredll.dll", EntryPoint = "FindWindow")]            
句柄的使用(一)—— 点击不可点击按钮和修改按钮标题
在Window系统中,有些窗口的按钮可能没办法按下去(例如有些软件的功能按钮要付费才能使用),我们可以通过给按钮的“句柄”发送鼠标点击消息来破解 .例如鼠标属性窗口: 1、打开vs中的工具中的spy++ 2、点击工具栏中“搜索”的“查找窗口(alt+F3)”,调出窗口搜索界面,然后把“查找窗口工具”右边的图标按住放置到要点击的按钮上,即可获取该按钮的句柄。 3、给按钮发送鼠标点击消息:#inc
C# 窗口、控件句柄操作
最近在程序中需要用到摄像头以及视频的展示和播放,大多数SDK运用的窗口和句柄,在winform程序中很简单,直接要用到的元素或者控件点handle就行了,但是由于winform的界面实在的跟wpf比起来,真的后者要好很多,因此能不能也在wpf中操作了,为此我度娘了下!    其实在wpf下操作也很简单,不过稍微要麻烦点: 引入命名空间:System.Windows.Interop 获取窗体的
【进程间的通信】☞项目引入——C#通过Windows API 调用其他程序、触发按钮Click事件
前言 在此之前对进程通信不太了解。 最近因项目需要稍有涉足,目前还在学习中 正文   项目需求   两个独立的解决方案,属于两个项目,在系统中开辟两个进程。   需要在第一个项目中调用第二个项目,对第二个项目进行操作。 结语
VB获取窗体上的按钮控件并单击示例
例一:自动点击计算器上的个按钮Module1.bas:程序代码Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongDeclare Function FindWindowEx Lib "user32
C#窗口句柄为例QQ
 获取句柄   using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Sys
AutoIT对窗体控件进行操作的例子
#include ;获取窗口句柄 $handle = WinGetHandle(".NET Reflector 6") WinActivate($handle) ;获取控件句柄; $control = ControlGetHandle($handle,"","WindowsForms10.SysListView32.app.0.232467a_r11_ad11") ;获取列表中List数目 $c
wpf C# 操作DirectUI窗口 SendMessage+MSAA
最近做一个抓取qq用户资料的工具,需要获取qq窗口上的消息,以前这种任务是用句柄获取窗口中的信息,现在qq的窗口用的是DirectUI,只有窗口句柄,没有控件句柄,句柄这条路走不通了。不过较新版的qq的部分控件实现了微软的IAccessible接口(称为Microsoft Active Accessibility技术,简称MSAA),可以用另一套函数获取qq窗口的信息。不过要对窗口进行输入还是要靠句柄,上面说过,DirectUI的窗口只有一个句柄,因此模拟输入的时候不需要查找到具体的控件句柄,但要注意获取控
在C#中怎样利用句柄发送消息
用C#调用Windows API向指定窗口发送 一、调用Windows API。  C#下调用Windows API方法如下:  1、引入命名空间:using System.Runtime.InteropServices;  2、引用需要使用的方法,格式:[DllImport("DLL文件")]方法的声明;  [DllImport("user32.dll")]private 
c#通过SendMessage发送消息,改变其他程序的下拉框控件(ComboBox)的值
IntPtr mwh = (IntPtr)Convert.ToInt32(handle);                         //ComboBox的句柄int result = SendMessage(mwh, 0x014D, -1, selectStr);            //改变ComboBox的值,selectStr为预期的下拉框选项int mwh_p = GetWi