Jump to content
Andrepereira9

[Resolvido] Alterar o focus para Bloco de Notas que já se encontra aberto

Recommended Posts

Andrepereira9

Boas.

Como posso fazer para que volte a meter o bloco de notas novamente com focus.

Ou seja, eu tenho um botão que  ao ser clicado, vai enviar dados selecionas para o bloco de notas. A primeira vez, estou a fazer assim

Shell("Notepad.exe", AppWinStyle.NormalFocus)
SendKeys.Send(TextBox1.Text + Textbox2.text + ....)(

O meu problema é que à segunda, não sei como posso fazer para meter o bloco de notas com focus, para poder fazer o sendkeys.send


A informática chegou para resolver problemas que antes não existiam

Quem ri por último é porque está conectado a 52 Kbs.

Share this post


Link to post
Share on other sites
Caça

Tenta fazem o mesmo, mas em vez de utilizar o Shell, utiliza o Process


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
Caça

Simples

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Shell("Notepad", AppWinStyle.NormalFocus)

        SendKeys.Send(TextBox1.Text + Textbox2.text)

    End Sub

End Class

pode colocar obviamente quantas caixa de texto quiseres.

Testado (Y)

?????????????????? 😲


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
Andrepereira9

Super Oliks - Isso não vai fazer o que eu pretendo. Isso vai abrir um novo bloco de notas. O que eu queria era voltar a por um bloco de notas que já se encontra aberto com focus.


A informática chegou para resolver problemas que antes não existiam

Quem ri por último é porque está conectado a 52 Kbs.

Share this post


Link to post
Share on other sites
Tiago Salgado

Pode ser necessário algum ajuste, mas ve lá se é o que pretendes:

Adicionas um botão (button1) e uma caixa de texto (textbox1), e este código.

        const int WM_KEYDOWN = 0x100;

        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

        [DllImport("user32.dll")]
        static extern byte VkKeyScan(char ch);

        [DllImport("User32.Dll", EntryPoint = "PostMessageA")]
        static extern bool PostMessage(IntPtr hWnd, uint msg, int wParam, int lParam);

        private void button1_Click(object sender, EventArgs e)
        {
            IntPtr notepadWindow = FindWindow("Notepad", null);
            if (!notepadWindow.Equals(IntPtr.Zero))
            {
                IntPtr p = FindWindowEx(notepadWindow, IntPtr.Zero, "Edit", null);
                if (!p.Equals(IntPtr.Zero))
                {  
                    for (int i = 0; i < textBox1.Text.Length; i++)
                    {
                        PostMessage(p, WM_KEYDOWN, VkKeyScan(textBox1.Text[i]), 0);
                    }
                }
            }

        }

Share this post


Link to post
Share on other sites
jpaulino

Como podes ver há várias soluções :(

Aqui vai outra:

Começas por declarar a API

Private Declare Function SetForegroundWindow Lib "user32" (ByVal handle As IntPtr) As Integer

Depois, se for para iniciar o notepad e escrever:

        Dim p As Process = Process.Start("notepad.exe")
        p.WaitForInputIdle()
        SetForegroundWindow(p.MainWindowHandle)
        SendKeys.Send("test")

Se for para escrever numa janela do notepad já aberta:

        Dim ps() As Process = Process.GetProcessesByName("Notepad")

        If ps.Length > 0 Then
            For Each p As Process In ps
                If p.MainWindowTitle.Contains("Nome do Ficheiro") Then
                    p.WaitForInputIdle()
                    SetForegroundWindow(p.MainWindowHandle)
                    SendKeys.Send("test")
                End If
            Next
        End If

Atenção que o método usando o PostMessage, como o Tiago te mostrou, pode ser mais eficaz ... experimenta ambos ;)

Share this post


Link to post
Share on other sites
jpaulino

Chegaste a testar alguma das soluções apresentadas por mim e pelo Tiago?

Não é só pedir ajuda .... é preciso também dar feedback a quem tentou ajudar.

Share this post


Link to post
Share on other sites
Andrepereira9

Peço desculpa, mas pensei que tinha marcado como resolvido  😳

Testei com as 2 maneiras, mas ficou com o código sugerido pelo jpaulino


A informática chegou para resolver problemas que antes não existiam

Quem ri por último é porque está conectado a 52 Kbs.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.