kkdxghlctlcxxtidyuum Ответов: 0

Держите родительскую форму в фокусе (модальном) при взаимодействии с дочерней формой?


Всем привет,

У меня есть детская форма внутри моей формы. Когда я щелкаю внутри дочерней формы, родительская форма (моя форма) теряет фокус. Как я могу предотвратить это и сохранить фокус основной родительской формы, даже если щелкну в дочерней форме?

Просто чтобы прояснить, что я имею в виду под "в фокусе", эта картина демонстрирует сфокусированную форму (та, что спереди) и форму, которая не находится в фокусе (та, что сзади):
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]

Решено!

0 Ответов