Focus issue on Form Load

前端 未结 2 1890
你的背包
你的背包 2021-01-29 05:32

I have an ActiveX control (written in VB 6.0 or C++ maybe) that we are using as an AxInterop in a C# WinForms program. It is very much like a text box but with some special logi

2条回答
  •  -上瘾入骨i
    2021-01-29 06:06

    You can use the WindowsApi.SetFocus method to set the focus.
    This method can be used to set a focus on a specific control in an external application, so it should work in your application on a 3rd party control.

    Here is another option - a working block of code to set focus for a control in an external application in winforms:

        [DllImport("user32.dll")]
        static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);
        [DllImport("kernel32.dll")]
        static extern IntPtr GetCurrentThread();
    
        [DllImport("user32.dll")]
        static extern bool AttachThreadInput(IntPtr idAttach, IntPtr idAttachTo,  bool fAttach);
    
        [DllImport("user32.dll", SetLastError = true)]
        static extern bool BringWindowToTop(IntPtr hWnd);
    
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool SetForegroundWindow(IntPtr hWnd);
    
        [DllImport("User32.dll", EntryPoint = "FindWindow")]
        public static extern IntPtr FindWindow(String lpClassName, String lpWindowName);
        [DllImport("user32.dll")]
        static extern IntPtr SetFocus(IntPtr hWnd);
    
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowsProc lpEnumFunc, string  lParam);
        private delegate bool EnumWindowsProc(IntPtr hWnd, string className);
    
        [DllImport("user32.dll")]
        static extern uint RealGetWindowClass(IntPtr hwnd, [Out] StringBuilder pszType,   uint cchType);
    
    
        void SetFocus(IntPtr hwndTarget, string childClassName)
        {
            // hwndTarget is the other app's main window 
            // ...
            IntPtr targetThreadID = GetWindowThreadProcessId(hwndTarget, IntPtr.Zero); //target thread id
            IntPtr myThreadID = GetCurrentThread(); // calling thread id, our thread id
    
            bool lRet = AttachThreadInput(myThreadID, targetThreadID, true); // attach current thread id to target window
    
            // if it's not already in the foreground...
            lRet = BringWindowToTop(hwndTarget);
            SetForegroundWindow(hwndTarget);
    
            // Enumerate and find target to set focus on
            EnumChildWindows(hwndTarget, OnChildWindow, childClassName);
        }
    
        List windowHandles = new List();
        static bool OnChildWindow(IntPtr handle, string className)
        {
            // Find class of current handle
            StringBuilder pszType = new StringBuilder();
            pszType.Capacity = 255;
            RealGetWindowClass(handle, pszType, (UInt32)pszType.Capacity);
    
            string s = pszType.ToString();
    
            // Remove (potentially) unneeded parts of class
            if (s.Length > className.Length)
            {
                s = s.Substring(0, className.Length);
            }
    
            // Set focus on correct control
            if (s == className)
            {
                SetFocus(handle);
            }
    
            return true;
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
            InitializeComponent();
    
            SetFocus(this.Handle, "");
    
        }
    
    
    

    If you don't know the classname of that textbox you can use spy++

    提交回复
    热议问题