相关疑难解决方法(0)

C#强制表格焦点

所以,在询问这个问题之前,我确实搜索了谷歌和SO.基本上我有一个DLL,它有一个编译成它的表单.表单将用于向屏幕显示信息.最终它将是异步的,并在dll中暴露了大量的自定义.现在我只想让它正确显示.我遇到的问题是我通过在Powershell会话中加载它来使用dll.因此,当我尝试显示表单并让它到达顶部并具有焦点时,显示在所有其他应用程序上没有问题,但我不能在我的生活中让它显示在Powershell窗口上.这是我目前用来尝试显示的代码.我确信,一旦我弄明白,大多数都不会被要求,这只是代表我通过谷歌找到的所有东西.

CLass Blah
{
        [DllImport("user32.dll", EntryPoint = "SystemParametersInfo")]
        public static extern bool SystemParametersInfo(uint uiAction, uint uiParam, uint pvParam, uint fWinIni);

        [DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
        public static extern bool SetForegroundWindow(IntPtr hWnd);

        [DllImport("User32.dll", EntryPoint = "ShowWindowAsync")]
        private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
        private const int WS_SHOWNORMAL = 1;

    public void ShowMessage(string msg)
    {
            MessageForm msgFrm = new MessageForm();
            msgFrm.lblMessage.Text = "FOO";
            msgFrm.ShowDialog();
            msgFrm.BringToFront();
            msgFrm.TopMost = true;
            msgFrm.Activate();

            SystemParametersInfo((uint)0x2001, 0, 0, 0x0002 | 0x0001);
            ShowWindowAsync(msgFrm.Handle, WS_SHOWNORMAL);
            SetForegroundWindow(msgFrm.Handle);
            SystemParametersInfo((uint)0x2001, 200000, 200000, 0x0002 …
Run Code Online (Sandbox Code Playgroud)

c# winforms

22
推荐指数
2
解决办法
5万
查看次数

启动流程而不会窃取焦点(C#)

我需要能够启动进程(控制台和窗口)而不会窃取焦点.我发现在.NET框架中执行此操作的唯一方法是使用Microsoft.VisualBasic.AppWinStyle的Microsoft.VisualBasic.Interaction.Shell.[Minimized | Normal] NoFocus(映射到SW_SHOWMINNOACTIVE/SW_SHOWMA传递给ShellExecute).

在我的代码的当前版本(它确实窃取焦点),我使用System.Diagnostics.Process,并依赖于我提供的一些功能,Interaction.Shell方法没有.

2个问题(一个严重,一个让我感到沮丧,我真的不希望得到一个好的答案)

1.)我是否正确,我别无选择,只能自己包装CreateProcess或ShellExecuteEx,或者我错过了其他一些解决方案?我真的希望避免这种情况,因为流程是这样除了这种疏忽了完整的和有用的包装,并有将实现这么多的功能,P/Invoke调用调试,以及各种配套的痛苦.

2.)为什么Microsoft的一个团队会创建这样一个(否则)完整的包装器,然后从ProcessWindowStyle中排除一半可能的值,而另一个团队创建了一个类似的包装器,它不太完整,但提供了所有有用的窗口样式?

c# winapi frameworks process

16
推荐指数
1
解决办法
8281
查看次数

如何激活由另一个进程启动的窗口

我想这可能是不可能的。请证明我错了。

以下设置:

  • 我的带有 GUI 的 .NET C# 应用程序(让我们称之为它gui)通过创建一个来打开另一个应用程序(让我们称之为它servernew Process()
  • server由其他人开发)以一个参数启动以隐藏其 GUI
  • 等待gui用户进行一些输入
  • thengui命令server执行一些任务
  • 这些任务是在我提供给的程序集/DLL 中定义的server
  • 其中一项任务是打开表单/对话框并向用户询问更多问题

现在,由于整个用户体验需要针对重复操作进行优化,因此打开的 GUI 元素(窗口/表单/对话框)需要预先选择/聚焦/活动。

第一个问题的出现是因为我没有找到这些属性(Focus、Active、Selected、TopMost)之间差异的明确解释。

现在真正的问题是,我如何确保所有 GUI 元素都处于活动状态并被选中,无论它们是由我的gui进程还是由server进程启动?

使用 WINAPI 可以更强大我读到所以我定义了以下内容

// required to use WINAPI for RegainFocus();
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern int SetForegroundWindow(IntPtr hwnd);
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern IntPtr SetActiveWindow(IntPtr hwnd);
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

static private void RegainFocus() …
Run Code Online (Sandbox Code Playgroud)

.net c# winapi winforms

2
推荐指数
1
解决办法
3509
查看次数

标签 统计

c# ×3

winapi ×2

winforms ×2

.net ×1

frameworks ×1

process ×1