C# C中的主句柄和数字错误#

C# C中的主句柄和数字错误#,c#,C#,我尝试将我的第一个自动发送密钥编码到一个已经运行的进程 我对进程列表有一个问题:如果两个目标同时打开,这意味着它们具有相同的MainWindowTitle,那么我的应用程序只发送到活动窗口 我有没有办法把钥匙送到2号目标?还有我在代码中使用的数字不起作用,只有F1到F12起作用 mega.co.nz/#!O1Yx1YyR!XtDHsEHbqrj3_EzdIpC8xD0jeo_vkbmIoCnkVQbQiO0 这是我的项目您应该将相关代码粘贴到stackoverflow本身,而不是引用外部站点

我尝试将我的第一个自动发送密钥编码到一个已经运行的进程

我对进程列表有一个问题:如果两个目标同时打开,这意味着它们具有相同的MainWindowTitle,那么我的应用程序只发送到活动窗口

我有没有办法把钥匙送到2号目标?还有我在代码中使用的数字不起作用,只有F1到F12起作用

mega.co.nz/#!O1Yx1YyR!XtDHsEHbqrj3_EzdIpC8xD0jeo_vkbmIoCnkVQbQiO0


这是我的项目

您应该将相关代码粘贴到stackoverflow本身,而不是引用外部站点

话虽如此,您的代码结构如下:

  • 您可以列出所有窗口标题:

        cb_procecss.Items.Clear();
        foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
        {
            if (p.MainWindowTitle!= "")
                cb_procecss.Items.Add(p.MainWindowTitle);
        }
    
  • 用户从列表中选择,然后您尝试将消息发布到具有该标题的窗口:

        Send(key, cb_procecss.Text.ToString().Trim());
    
  • 由于没有记住流程信息,您在尝试确定选择了哪个窗口时会感到困惑:

    public void Send(int Key, string _FindWindow)
    {
        IntPtr Handle = FindWindow(null, _FindWindow);
        PostMessage(Handle, WM_KEYDOWN, Key, 0);
    }
    
  • 另一种策略是记住流程本身,然后直接使用其属性,例如在某个轻量级类中:

        public class ProcessWindowWrapper : IDisposable
        {
            Process process;
    
            public ProcessWindowWrapper(Process process)
            {
                this.process = process;
            }
    
            public Process Process { get { return process; } }
    
            public IntPtr MainWindowHandle
            {
                get
                {
                    try
                    {
                        return (process == null ? IntPtr.Zero : process.MainWindowHandle);
                    }
                    catch (InvalidOperationException)
                    {
                        // Process exited
                        return IntPtr.Zero;
                    }
                }
            }
    
            public override string ToString()
            {
                return (process == null ? string.Empty : process.MainWindowTitle);
            }
    
            #region IDisposable Members
    
            public void Dispose()
            {
                // Dispose of unmanaged resources.
                Dispose(true);
                // Suppress finalization.  Since this class actually has no finalizer, this does nothing.
                GC.SuppressFinalize(this);
            }
    
            void Dispose(bool disposing)
            {
                if (disposing)
                {
                    var process = Interlocked.Exchange(ref this.process, null);
                    if (process != null)
                        process.Dispose();
                }
            }
    
            #endregion
        }
    
    把它放在列表中而不是主窗口标题字符串中,您的簿记问题就会得到解决。通过重写
    ToString()
    可以确保列表中显示正确的标题


    请注意,您最终应该这样做,因此这个类应该实现我已经完成的
    IDisposable

    您需要在问题中包含相关代码,而不是指向外部资源的链接。