我需要从几个TextBox中删除焦点.我试过用:
textBox1.Focused = false;
Run Code Online (Sandbox Code Playgroud)
它的ReadOnly属性值是true.
然后我尝试将焦点设置在表单上,以便从所有TextBox中删除它,但这也无法工作:
this.Focus();
Run Code Online (Sandbox Code Playgroud)
并且在false选择文本框时返回该函数.
那么,如何从TextBox中删除焦点?
在Windows中,前台窗口和活动窗口有什么区别?具体而言,前景窗口在什么情况下不能成为活动窗口?如果2个术语指的是相同的概念,为什么有2个术语.
这里的msdn文档提到"单击一个窗口,或者使用ALT+ TAB或ALT+ ESC组合键"使窗口处于活动状态和前景.没有明确说明2个术语之间的区别.检查MSDN.
我有一个弹出用户屏幕的表单TopMost=true,但是它会窃取焦点.如何才能让它在第一次出现时没有窃取焦点?
我有一个相当复杂的应用程序系列,它依赖于在前台切换应用程序的能力.
我的问题是,每隔5或6次在前台切换应用程序,它就无法使应用程序前进.GetLastError不报告任何问题.通常我会在前台看到正确的应用程序闪存片刻,然后前一个应用程序可见.
我有一个管理器应用程序,我有源,它产生和控制约4个我没有源的应用程序.它产生/控制的应用程序之一也是一个产生/控制大约5个应用程序的管理器.
这是一种自助服务终端设计,因此用户甚至不会有键盘或鼠标,只需一个触摸屏.
我已经尝试了Win32调用的每个组合来控制它们我只是出于想法.
我的第一次尝试是:
SetWindowPos(hApp, HWND_TOPMOST, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
SetWindowPos(hApp, HWND_NOTOPMOST, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
Run Code Online (Sandbox Code Playgroud)
我的第二次尝试是:
SetForegroundWindow(hApp);
SetActiveWindow(hApp);
SetFocus(hApp);
Run Code Online (Sandbox Code Playgroud)
我的第三次尝试:DWORD dwThreadID = GetWindowThreadProcessId(hApp,NULL); AttachThreadInput(dwThreadID,GetCurrentThreadId(),true);
SetForegroundWindow(hApp);
SetActiveWindow(hApp);
SetFocus(hApp);
AttachThreadInput( dwThreadID, GetCurrentThreadId(), false);
Run Code Online (Sandbox Code Playgroud)
我的第四次尝试:
DWORD dwThreadID = GetWindowThreadProcessId(hApp, NULL);
AttachThreadInput( dwThreadID, GetCurrentThreadId(), true);
SetWindowPos(hApp, HWND_TOPMOST, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
SetWindowPos(hApp, HWND_NOTOPMOST, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
SetForegroundWindow(hApp);
SetActiveWindow(hApp);
SetFocus(hApp);
AttachThreadInput( dwThreadID, GetCurrentThreadId(), false);
Run Code Online (Sandbox Code Playgroud)
在窗口切换方面,我觉得我错过了一个重要的问题.我知道只有前台进程可以切换窗口,但是当我的主管理器程序正在产生并启动我需要控制的所有其他进程时,我觉得它应该能够移动这些窗口.任何建议或意见表示赞赏.
我用我的程序打开了一个记事本,Process.Start()但新打开的记事本覆盖了屏幕.但我确实希望我的应用程序保持其重点.
我同样(使用相同的Process.Start)打开MS Excel和Word,但要将焦点重新放回我的表单,我需要编写的是:
this.Focus();
Run Code Online (Sandbox Code Playgroud)
但是用记事本怪起来:我打开记事本(以及所有其他这样的过程)
Process process = new Process();
process.StartInfo.UseShellExecute = true;
process.EnableRaisingEvents = true;
process.StartInfo.FileName = @"abc.log";
process.Start();
Run Code Online (Sandbox Code Playgroud)
现在记事本成为焦点.
我试过这些:
this.Activate(),this.Focus()不用提
[DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
public static extern IntPtr SetFocus(HandleRef hWnd);
{
IntPtr hWnd = myProcess.Handle;
SetFocus(new HandleRef(null, hWnd));
}
Run Code Online (Sandbox Code Playgroud)[DllImport("User32")]
private static extern int SetForegroundWindow(IntPtr hwnd);
[DllImportAttribute("User32.DLL")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
private const int SW_SHOW = 5;
private const int SW_MINIMIZE = 6;
private const int SW_RESTORE = 9; …Run Code Online (Sandbox Code Playgroud)我正在尝试用c#设置一个进程窗口到前台/焦点(从那个时候没有焦点的应用程序),因此我使用的是user32.dll static extern bool SetForegroundWindow(IntPtr hWnd)方法:
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
public void setFocus()
{
SetForegroundWindow(process.MainWindowHandle);
}
Run Code Online (Sandbox Code Playgroud)
一切都工作得很好,但只有当我打开visual studio 2008时,我甚至不需要从VS08启动应用程序,它足以让项目打开它.我正在关闭项目的那一刻,我的应用程序无法将另一个窗口设置为前景.唯一的结果是,在任务栏中,另一个窗口突出显示为蓝色.我将再次使用VS08打开我的项目它的工作正常.
我没有丝毫想法为什么......我的问题可能是他不能导入dll但是它不会被高亮,而其他win32函数就像static extern bool ShowWindow(IntPtr hWnd, IntPtr status);工作即使在项目关闭时也能工作.
针对这个问题的任何解决方案或提示?
编辑:
我阅读了该函数的备注,我认为我的应用程序没有焦点,所以我尝试了这个:
[DllImport("user32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll")]
static extern bool AllowSetForegroundWindow(int procID);
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll", SetLastError = true)]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
public void setAUTFocus()
{
IntPtr hWnd = GetForegroundWindow();
uint processID = 0; …Run Code Online (Sandbox Code Playgroud) 我正在研究一种消息传递工具.消息传递窗口是整个应用程序的一部分.当有一些消息传来时,我需要窗口转到前面.我正在使用这段代码:
if( m_hwnd == NULL || !::IsWindow(m_hwnd) )
return E_UNEXPECTED;
if(::IsIconic(m_hwnd))
{
::ShowWindowAsync( m_hwnd, SW_RESTORE );
}
::SetWindowPos(m_hwnd, HWND_TOP, 0, 0, 0, 0, SWP_ASYNCWINDOWPOS | SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
::SetForegroundWindow(m_hwnd);
if( pvbProcessed != NULL )
*pvbProcessed = VARIANT_TRUE;
return S_OK;
Run Code Online (Sandbox Code Playgroud)
我甚至试图做一个TOPMOST但仍然在某些情况下它不起作用.我还尝试了:: BringToFront().
任何人都可以帮助或解释为什么它不起作用?这是一个已知的微软限制.
我正在开发一个wpf应用程序,而不是在用户关闭按钮时退出应用程序我将其最小化到托盘(类似于谷歌谈话).
void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
e.Cancel = true;
this.Hide();
}
Run Code Online (Sandbox Code Playgroud)
我需要的是,如果用户忘记了应用程序的实例并尝试打开新实例,我必须关闭第二个实例并将我的应用程序设置为前台应用程序.如果应用程序处于最小化状态(未隐藏),我可以执行此操作.我使用以下代码
protected override void OnStartup(StartupEventArgs e)
{
Process currentProcess = Process.GetCurrentProcess();
var runningProcess = (from process in Process.GetProcesses()
where
process.Id != currentProcess.Id &&
process.ProcessName.Equals(
currentProcess.ProcessName,
StringComparison.Ordinal)
select process).FirstOrDefault();
if (runningProcess != null)
{
Application.Current.Shutdown();
ShowWindow(runningProcess.MainWindowHandle, 5);
ShowWindow(runningProcess.MainWindowHandle, 3);
}
}
[DllImport("user32.dll")]
private static extern Boolean ShowWindow(IntPtr hWnd, Int32 nCmdShow);
Run Code Online (Sandbox Code Playgroud)
当应用程序最小化时,它具有MainWindowHandle的一些唯一值.当我隐藏应用程序时,runningProcess的MainWindowHandle 显示为0.我认为这就是为什么我的应用程序在处于隐藏状态时不打开,但不知道如何修复它.
告诉我是否需要发布更多代码或澄清任何内容.先感谢您.