相关疑难解决方法(0)

如何将我的应用程序窗口置于前面?

如何将我的应用程序窗口置于前面?例如,我的应用程序需要注意.

这是我的个人计划.我需要这个功能.

这就是我得到的.但它没有 100%的工作时间.

public void BringToFrontToEnterCaptha()
{
    if (InvokeRequired)
    {
        Invoke(new Action(BringToFrontToEnterCaptha));
    }
    else
    {
        this.TopMost = true;
        this.Focus();
        this.BringToFront();
        this.textBox1.Focus();
        this.textBox1.Text = string.Empty;
        System.Media.SystemSounds.Beep.Play();
    }
}

public void BringToBackAfterEnterCaptha()
{
    if (InvokeRequired)
    {
        Invoke(new Action(BringToBackAfterEnterCaptha));
    }
    else
    {
        this.TopMost = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

我从背景工作者那里打电话给他们.

BringToFrontToEnterCaptha();
while (!ready)
{
    Thread.Sleep(100);
}
BringToBackAfterEnterCaptha();
Thread.Sleep(300);
Run Code Online (Sandbox Code Playgroud)

按"接受"按钮后,bool ready设置为true.

我工作得很好,但并不总是.

.net c# winforms

77
推荐指数
7
解决办法
16万
查看次数

如何在C#中显示前面的表格

伙计们,

请问有没有人知道如何从一个看不见的应用程序中显示一个表单,让它获得焦点(即出现在其他窗口的顶部)?我在C#.NET 3.5中工作.

我怀疑我采取了"完全错误的方法"......我没有 Application.Run(新的TheForm())而不是我(新的TheForm()).ShowModal() ... Form基本上是一个模态对话,带几个复选框; 文本框,以及确定和取消按钮.用户勾选一个复选框并输入描述(或其他),然后按OK,表单消失,进程从表单中读取用户输入,处理它,然后继续处理.

这是有效的,除非表单显示它没有得到焦点,而是它出现在"主机"应用程序后面,直到你在任务栏中点击它(或其他).这是一个最烦人的行为,我预测会导致许多"支持调用",而现有的VB6版本没有这个问题,所以我在可用性方面倒退了...用户不会接受(并且也不应该).

所以...我开始认为我需要重新考虑整个shebang ...我应该预先显示表单,作为"正常应用程序"并将处理的剩余部分附加到OK按钮单击事件.它应该工作,但这需要时间,我没有(我已经超过时间/预算)...所以首先我真的需要尝试使当前的方法工作...即使快速和 - 脏的方法.

所以,请有人知道如何"强制".NET 3.5表格(通过公平的方式或家禽)来获得焦点?我在想"魔术"的Windows API调用(我知道

Twilight Zone:这似乎只是工作中的一个问题,我们正在Windows XP SP3上使用Visual Studio 2008 ...我刚刚无法在家中使用SSCCE(见下文)重现问题关于Vista Ulimate的C#2008 ......这很好用.咦?WTF?

另外,我发誓昨天在工作时显示了我运行EXE时的表格,但不是直接从IDE(我刚刚忍受的)F5'(或Ctrl-F5'ed)时... ...在家里表单显示正常.Totaly confusterpating!

它可能相关,也可能不相关,但Visual Studio今天早上在调试模式下运行并"动态"编辑代码时崩溃并烧毁...它被卡住了我认为是无限循环的错误消息.错误消息是关于"无法调试此项目,因为它不是当前项目,或者其他东西......所以我只是使用进程资源管理器将其杀死.它再次启动,甚至提供恢复"丢失"文件,我接受的报价.

using System;
using System.Windows.Forms;

namespace ShowFormOnTop {
    static class Program {
        [STAThread]
        static void Main() {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            //Application.Run(new Form1());
            Form1 frm = new Form1();
            frm.ShowDialog();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

背景:我正在将现有的VB6实现移植到.NET ...它是一个名为MapInfo的"客户端"GIS应用程序的"插件" .现有客户"无形地工作",我的指示是"尽可能保持新版本与旧版本尽可能接近",这很好(经过多年的修补); 它只是用不支持的语言编写的,所以我们需要移植它.

关于我:我通常都是C#和.NET的菜鸟,虽然我有一个底部擦拭证书,我已经是一名专业程序员已经10年了; 所以我有点"知道一些东西".

任何见解都是最受欢迎的......谢谢大家花时间阅读这篇文章.遗嘱(显然)不是我的强项.

干杯.基思.

c# forms z-order

23
推荐指数
3
解决办法
8万
查看次数

如何使用DoEvents()而不是"邪恶"?

简单的搜索DoEvents会带来很多结果,这些结果基本上会导致:

DoEvents是邪恶的.不要使用它.请改用线程.

一般引用的原因是:

  • 重新入侵问题
  • 表现不佳
  • 可用性问题(例如,在禁用的窗口上拖放)

但是一些值得注意的Win32功能,例如TrackPopupMenuDoDragDrop 执行自己的消息处理以保持UI响应,就像这样DoEvents.
然而,这些问题似乎都没有遇到过这些问题(性能,再入等等).

他们是如何做到的呢?他们如何避免引用的问题DoEvents?(或者他们?)

windows winapi doevents visual-c++ winforms

23
推荐指数
1
解决办法
8643
查看次数

C#以编程方式取消最小化表单

如何获取当前最小化的表单并将其还原到以前的状态.我找不到任何方法来确定它以前WindowStateNormal或是Maximized; 但我知道信息必须存储在某个地方,因为Windows在任务栏上使用应用程序时没有问题.

c# winforms

9
推荐指数
2
解决办法
6599
查看次数

如何使用c#引入窗口前景?

我试图带一个窗口前景.我正在使用此代码.但它不起作用.有人可以帮忙吗?

ShowWindowAsync(wnd.hWnd, SW_SHOW);

SetForegroundWindow(wnd.hWnd);
// Code from Karl E. Peterson, www.mvps.org/vb/sample.htm
// Converted to Delphi by Ray Lischner
// Published in The Delphi Magazine 55, page 16
// Converted to C# by Kevin Gale
IntPtr foregroundWindow = GetForegroundWindow();
IntPtr Dummy = IntPtr.Zero;

uint foregroundThreadId = GetWindowThreadProcessId(foregroundWindow, Dummy);
uint thisThreadId = GetWindowThreadProcessId(wnd.hWnd, Dummy);

 if (AttachThreadInput(thisThreadId, foregroundThreadId, true))
 {
    BringWindowToTop(wnd.hWnd); // IE 5.5 related hack
    SetForegroundWindow(wnd.hWnd);
    AttachThreadInput(thisThreadId, foregroundThreadId, false);
 }

 if (GetForegroundWindow() != wnd.hWnd)
 {
     // Code by Daniel P. Stasinski
     // …
Run Code Online (Sandbox Code Playgroud)

c# winapi window foreground

6
推荐指数
3
解决办法
3万
查看次数

如何将已经显示的表格带到前台并集中注意力?

如何以编程方式(假设我们已经将它作为变量引用)将一个已经显示的表单带到前台并将其集中在C#WinForms应用程序中?

.net c# winforms

3
推荐指数
1
解决办法
2253
查看次数

C#新形式从未获得焦点

我一直在尝试用自己的选项窗口编写一个小应用程序.当我尝试启动窗口时,我似乎无法将注意力集中在新窗体上.这不是mdi表单,而只是我在用户从菜单中选择选项时创建的新表单.应该注意的是,Form.Show返回false,这意味着新表单永远不会获得焦点.

我尝试了多种加载表单的方法,但都失败了:

来自电话表格:

ServerForm SF = new ServerForm(ref DataLoader, false);
SF.Show();
SF.Focus();
// Fails
Run Code Online (Sandbox Code Playgroud)

在表单内部:

this.Show();
this.BringToFront();
this.Activate();
this.TopMost = true;
// Fails
Run Code Online (Sandbox Code Playgroud)

将表单设置为可选:

this.SetStyle(System.Windows.Forms.ControlStyles.Selectable, true);
...
ServerForm SF = new ServerForm(ref DataLoader, false);
SF.Show();
SF.Focus();
// Fails
Run Code Online (Sandbox Code Playgroud)

使用旧API:

[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern int ShowWindow(IntPtr handle, int nCmdShow);    
ServerForm SF = new ServerForm(ref DataLoader, false);
ShowWindow(SF.Handle, 3);
SF.Show();
SF.Focus();
// Fails
Run Code Online (Sandbox Code Playgroud)

传递父母

ServerForm SF = new ServerForm(ref DataLoader, false);
SF.Show(this);
SF.Focus();
// Fails
Run Code Online (Sandbox Code Playgroud)

在所有这些情况下,表单都会显示,但生成的表单仍然会关注新表单.即使我在创建新表单之前禁用旧表单,也会发生这种情况.

有什么建议?

c# forms focus

0
推荐指数
1
解决办法
1万
查看次数

当在连续运行在不同线程中并由用户代码关闭的表单上使用时,TopMost不起作用

我有以下示例代码

   [STAThread]
    static void Main(string[] args)
    {
        Thread thread = new Thread(() =>
        {
            using (var mww = new Form1())
            {
                Application.Run(mww);
            }
        });
        thread.Start();
        thread.Join();

        thread = new Thread(() =>
        {
            using (var mww = new Form1())
            {
                Application.Run(mww);
            }
        });
        thread.Start();
        thread.Join();

        thread = new Thread(() =>
        {
            using (var mww = new Form1())
            {
                Application.Run(mww);
            }
        });
        thread.Start();
        thread.Join();
    }
Run Code Online (Sandbox Code Playgroud)

其中Form1定义为:

public partial class Form1 : Form
{
    private readonly Timer _myTimer = new Timer();

    public Form1() …
Run Code Online (Sandbox Code Playgroud)

.net c# winforms

0
推荐指数
1
解决办法
1399
查看次数

标签 统计

c# ×7

winforms ×5

.net ×3

forms ×2

winapi ×2

doevents ×1

focus ×1

foreground ×1

visual-c++ ×1

window ×1

windows ×1

z-order ×1