Держите родительскую форму в фокусе (модальном) при взаимодействии с дочерней формой?
Всем привет,
У меня есть детская форма внутри моей формы. Когда я щелкаю внутри дочерней формы, родительская форма (моя форма) теряет фокус. Как я могу предотвратить это и сохранить фокус основной родительской формы, даже если щелкну в дочерней форме?
Просто чтобы прояснить, что я имею в виду под "в фокусе", эта картина демонстрирует сфокусированную форму (та, что спереди) и форму, которая не находится в фокусе (та, что сзади):
http://www.functionx.com/vcsharp/images/modal1.gif
Заранее спасибо. :Д
Мой код:
<pre>Imports System.Runtime.InteropServices Public Class Form1 Private Const WM_SYSCOMMAND As Integer = &H112 Private Const SC_MAXIMIZE As Integer = &HF030 <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> Public Shared Function SetParent(ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr End Function <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> Friend Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr End Function Private Sub SetChildTimer1_Tick(sender As Object, e As EventArgs) Handles SetChildTimer1.Tick Dim NtPdProcess As Process = Process.GetProcessesByName("notepad").FirstOrDefault If NtPdProcess IsNot Nothing Then SetParent(NtPdProcess.MainWindowHandle, Panel1.Handle) SendMessage(NtPdProcess.MainWindowHandle, WM_SYSCOMMAND, SC_MAXIMIZE, 0) End If End Sub Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim startInfo As New ProcessStartInfo("notepad.exe") Process.Start(startInfo) End Sub End Class
Что я уже пробовал:
Я пробовал экспериментировать с ZOrder, но, честно говоря, я еще не очень опытен.
Я пробовал экспериментировать с showdialog метод же, безрезультатно.
[no name]
Я предполагаю, что вам нравится фокусироваться на "основной форме" для ввода с клавиатуры. Я не знаю для чего это нужно vb.net но в других инструментах есть что-то вроде "KeyPreview" для формы. Может быть, есть что-то похожее в vb.net-что?
[no name]
Для ввода с клавиатуры, но не только для ввода с клавиатуры. У меня есть и другие элементы управления в Родительском окне, которые требуют, чтобы оно было в фокусе при взаимодействии с дочерней формой (например, menustrip - если основная форма не находится в фокусе, пользователь должен дважды щелкнуть, чтобы открыть заголовок menustrip (первый щелчок, чтобы получить форму в фокусе, второй-чтобы зарегистрировать элемент menustrip). Хотя большое спасибо за предложение :)
CHill60
Как вы надеетесь взаимодействовать с детской формой, если другая форма имеет фокус?
Используйте предварительный просмотр ключей и передавайте все, что не может быть обработано ребенком, родителю
[no name]
Все в порядке, поверьте мне, с детской формой можно взаимодействовать, даже если у нее нет фокуса (что необычно, но верно). Облегчает ли это возможное решение?
CHill60
Я спросил "как". Возможно картинка бы и помогла но ссылка не работает
[no name]
Спасибо за ваш ответ, ссылка действительно работает, но, к сожалению, CodeProject имеет ошибку, которая означает, что он перенаправляет прямо на эту страницу, попробуйте открыть новую вкладку и вставить URL-адрес.
Под "взаимодействием с" я подразумеваю нажатие на него.
Я благодарен Вам за помощь! :)
CHill60
Нет, связь не работает. Это не ошибка в проекте кода, это ваша разметка.[^]
CHill60
Хорошо. Я посмотрел на фотографию. У детской формы есть фокус. Форма сзади Этого не делает. Показать диалог-это, вероятно, путь вперед, но мы не можем помочь, если вы слишком расплывчаты и не делитесь своим кодом.
[no name]
Спасибо за ответ,
Вот мой код (или я просто опубликовал более читабельную версию в своем первоначальном вопросе).
Система Импорта.Во время выполнения.InteropServices
Общественного Класса Form1
Private Const WM_SYSCOMMAND As Integer = &H112
Private Const SC_MAXIMIZE As Integer = &HF030
&ЛТ;атрибут DllImport("user32.dll", функции setlasterror:=true, то набор символов:=набор символов.Авто)&ГТ;
Общие setparent осуществляет функции(hWndChild бывал в качестве указателя IntPtr, hWndNewParent бывал в качестве указателя IntPtr) Как IntPtr
Конечная Функция
&ЛТ;атрибут DllImport("user32.dll", функции setlasterror:=true, то набор символов:=набор символов.Авто)&ГТ;
Друг поделился функции метод SendMessage(hwnd элемента бывал в качестве указателя IntPtr, бывал МСГ как у uinteger, параметр wparam бывал в качестве указателя IntPtr, то lparam бывал в качестве указателя IntPtr) Как IntPtr
Конечная Функция
Private Sub SetChildTimer1_Tick(sender As Object, e As EventArgs) обрабатывает SetChildTimer1.Tick
Dim NtPdProcess As Process = Процесс.GetProcessesByName("Блокнот").Метода firstordefault
Если NtPdProcess-Это Не Ничто, То
SetParent(NtPdProcess.MainWindowHandle, Panel1.Ручка)
SendMessage(NtPdProcess.MainWindowHandle, WM_SYSCOMMAND, SC_MAXIMIZE, 0)
Конец, Если
Конец Подводной Лодки
Частная суб методе form1_load(отправителя как объект, а равно EventArgs) обрабатывает ключевое слово mybase.Загрузить
Dim startInfo как новый ProcessStartInfo("notepad.exe")
Процесс.Start(startInfo)
Конец Подводной Лодки
End Класса
Если вы вставите это в новый проект, создадите панель и таймер и назовете их соответствующим образом, Вы сможете увидеть, о чем я говорю, если вы нажмете на дочернюю форму. Родительская форма выходит из фокуса.
К сожалению, я слишком неопытен, чтобы знать, как реализовать ShowDialog - кстати, я пробовал, но в этом контексте я не знаю, как его использовать.
Большое спасибо!
CHill60
Вы начали новый процесс. Вы не показываете "дочернее окно". Я не понимаю, почему у вас есть таймер.
Используйте ссылку "улучшить вопрос", если вы хотите разместить код, кстати.
Я предлагаю вам вернуться к чертежной доске
[no name]
Таймер тикает каждые несколько секунд в случае, если Блокнот медленно запускается, как вы можете видеть (я опубликовал более читабельную версию в своем первоначальном ответе), приложение Блокнота установлено как дочернее (панель 1 является его родителем). Код работает хорошо, мне просто нужно, чтобы моя форма фокусировалась при взаимодействии с ребенком (щелчок по ней).
Спасибо
[EDIT]: кроме того, функция таймера важна в том случае, если файл, который я загружаю, чтобы стать моим родителем, является заставкой, каждый тик будет инициировать код и искать, является ли процесс "не ничем", и устанавливать его как дочерний для панели, если это процесс.
[no name]
- Нет, связь не работает. Это не ошибка в проекте кода, это ваша разметка.[^]"
А, понятно, прошу прощения.
[no name]
Кроме того, вот изображение формы, четко отображающее блокнот как дочерний (нет значка панели задач, не является независимым, "встроен" в мою форму: http://tinypic.com/r/2ce10ck/9
[no name]
Решено!