zoukankan      html  css  js  c++  java
  • 通达信自动交易软件 z

    1、要善用spy++

    2、不同的控件主要靠GetDlgCtrlID去区分

    3、要获得另一个进程的焦点窗口(GetFocus)需要调用AttachThreadInput

    4、尽量少用keybd_event模拟键盘输入,主要是该函数不能保证按键消息一定能被特定进程接收到。取而代之的是SendMessage(hwnd, WM_IME_CHAR, ...)。而模拟回车按下要用PostMessage (hFocus, WM_KEYDOWN, VK_RETURN, 0),SendMessage不知为何不起作用

    5、通达信在按下第一个数字键后会弹出键盘精灵,此时焦点窗口会转移到键盘精灵上,要重新调用GetFocus一次

    6、GetWindow(hMainWnd, GW_ENABLEDPOPUP)可以获得当前的弹出窗口句柄

    7、PostMessage(hPopup, WM_COMMAND, MAKEWPARAM(IDOK, BN_CLICKED), NULL),模拟“确定”键被按下

    8、EnumChildWindows函数可以枚举一个窗口的所有子窗口

     

    class ThreadHandler
    {
        #region P/Invoking and constants definition
        const uint WM_GETTEXT = 0x000D;
    
        [DllImport("user32.dll")]
        static extern IntPtr SetFocus(IntPtr hWnd);
    
        [DllImport("user32.dll")]
        private static extern int GetWindowThreadProcessId(IntPtr hWnd, uint lpdwProcessId = 0);
    
        delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);
        [DllImport("user32.dll")]
        static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn,
            IntPtr lParam);
    
        [DllImport("user32.dll")]
        static extern bool AttachThreadInput(int idAttach, int idAttachTo, bool fAttach);
    
        [DllImport("kernel32.dll")]
        static extern int GetCurrentThreadId();
    
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, int wParam, StringBuilder lParam);
    
        #endregion
    
        public readonly string ProcessName, WindowName;
        protected readonly int TargetThreadID, CurrentThreadID;
        protected readonly IntPtr TargetWindowHandle;
    
        public ThreadHandler(string processName, string windowName)
        {
            CurrentThreadID = GetCurrentThreadId();
            ProcessName = processName;
            WindowName = windowName;
    
            object[] objs = GetWindowThread(processName, windowName);
            if (objs == null)
            {
                throw new ArgumentException("Could not find the specified process/window.");
            }
    
            TargetThreadID = (int)objs[0];
            TargetWindowHandle = (IntPtr)objs[1];
        }
    
        public ThreadHandler(string processName)
        {
            CurrentThreadID = GetCurrentThreadId();
            ProcessName = processName;
    
            var processes = Process.GetProcessesByName(ProcessName);
            if (processes.Length == 0)
            {
                throw new ArgumentException("Could not find the specified process.");
            }
            var appProc = processes[0];
    
            WindowName = appProc.MainWindowTitle;
            TargetThreadID = GetWindowThreadProcessId(appProc.MainWindowHandle);
            TargetWindowHandle = appProc.MainWindowHandle;
        }
    
        public bool AttachThreadInput()
        {
            return AttachThreadInput(CurrentThreadID, TargetThreadID, true);
        }
    
        public bool DetachThreadInput()
        {
            return AttachThreadInput(CurrentThreadID, TargetThreadID, false);
        }
    
        public void SetFocus()
        {
            SetFocus(TargetWindowHandle);
        }
    
        static object[] GetWindowThread(string processName, string windowName)
        {
            var processes = Process.GetProcessesByName(processName);
            if (processes.Length > 0)
            {
                //Fill a list of handles
                var handles = new List<IntPtr>();
                foreach (ProcessThread thread in processes[0].Threads)
                    EnumThreadWindows(thread.Id,
                        (hWnd, lParam) => { handles.Add(hWnd); return true; }, IntPtr.Zero);
    
                //Create a stringbuilder to function as storage unit
                StringBuilder nameBuffer = new StringBuilder(64);
                foreach (var hWnd in handles)
                {
                    //And finally compare the caption of the window with the requested name
                    nameBuffer.Clear();
                    SendMessage(hWnd, WM_GETTEXT, nameBuffer.Capacity, nameBuffer);
                    if (nameBuffer.ToString() == windowName)
                    {
                        return new object[2] { GetWindowThreadProcessId(hWnd), hWnd };
                    }
                }
            }
            return null;
        }
    }
    static void Main(string[] args)
        {
            Console.WriteLine("Please input the name of the process to hook: ");
            string pName = Console.ReadLine();
            Console.WriteLine("Input the name of a specific window, or leave blank: ");
            string pWnd = Console.ReadLine();
            ThreadHandler threadHandler;
            try
            {
                if(!String.IsNullOrWhiteSpace(pWnd))
                    threadHandler = new ThreadHandler(pName, pWnd);
                else
                    threadHandler = new ThreadHandler(pName);
            }
            catch
            {
                Console.WriteLine("Error: " + pName +" does not seem to be running.");
                Console.ReadKey();
                return;
            }
    
            if (!threadHandler.AttachThreadInput())
            {
                Console.WriteLine("Error: The application tried to attach its Input Processing Mechanism to " + threadHandler.ProcessName + ", but failed.");
                Console.ReadKey();
                return;
            }
            Console.WriteLine("Input Processing Mechanism correctly attached to " + threadHandler.ProcessName + ".");
            threadHandler.SetFocus();
            InputSimulator.SimulateTextEntry("test"); //InputSimulator is a seemingly famous SendInput wrapper. Replacing this line with the code for a keystroke also doesn't work.
            Console.ReadLine();
            Console.WriteLine("Detaching Input Processing Mechanism.");
            threadHandler.DetachThreadInput();
        }

    以上代码尚不能工作,

    You should be able to use SetFocus to give focus to the control you are sending the keystrokes to.

    SendMessage and PostMessage can also be used to send keystrokes, but it's BAD PRACTICE and should be avoided.

    Check out System.Windows.Forms.SendKeys for information on sending keystrokes though the Forms class in .NET.

    In a lot of cases, if you don't need the keystrokes themselves, you can just change the text on a window using SendMessage with WM_SETTEXT if this is what you're looking to do.

    http://answer.techwikihow.com/334694/sendinput-working-attaching-thread-input-target-process.html

  • 相关阅读:
    Windows下tomcat进程监控批处理程序
    centos下利用mail命令进行邮件发送
    centos查看是否安装了某个软件
    tomcat监控,自动重启shell脚本
    mac终端命令大全介绍
    文件的编码是一个怎样的机制
    python中nltk的下载安装方式
    MySQL——修改root密码的4种方法(以windows为例)
    VNC轻松连接远程Linux桌面
    Linux 查看磁盘分区、文件系统、磁盘的使用情况相关的命令和工具介绍
  • 原文地址:https://www.cnblogs.com/zeroone/p/3713026.html
Copyright © 2011-2022 走看看