【问题标题】:Main Handle and Number error in C#C# 中的主句柄和数字错误
【发布时间】:2014-11-08 07:15:36
【问题描述】:

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

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

无论如何我可以将密钥发送到那个 2 目标吗?我在代码中使用的数字也不起作用,只有 F1 到 F12 起作用。

http://pastie.org/9703763#58-59,103-112

mega.co.nz/#!O1Yx1YyR!XtDHsEHbqrj3_EzdIpC8xD0jeo_vkbmIoCnkVQbQiO0

这是我的项目

【问题讨论】:

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

标签: c#


【解决方案1】:

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

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

  1. 您列出所有窗口标题:

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

        Send(key, cb_procecss.Text.ToString().Trim());
    
  3. 您在不记得进程信息的情况下试图弄清楚选择了哪个窗口时感到困惑:

    public void Send(int Key, string _FindWindow)
    {
        IntPtr Handle = FindWindow(null, _FindWindow);
        PostMessage(Handle, WM_KEYDOWN, Key, 0);
    }
    

另一种策略是记住进程本身,然后直接使用它的MainWindowHandle 属性,例如在一些轻量级类中:

    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(),您可以确保正确的标题显示在列表中。

注意你最终应该dispose of your Process class instances,所以这个类应该实现IDisposable,我已经这样做了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多