Kako proslijediti SHIFT + taster koristeci PostMessage() ?

Latest post 06-16-2009 14:53 by Cosmic Sailor. 0 replies.
  • 06-16-2009 14:53

    Kako proslijediti SHIFT + taster koristeci PostMessage() ?

    Dakle kako poslati SHIFT, CTRL ili ALT aplikaciji koja radi u pozadini koristreci PostMessage() funkciju.

    Poslije obimnijegog guglanja nasao sam da bi ovo trebalo da radi:

     

    public partial class Form1 : Form
        {


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

            [DllImport("user32.dll", EntryPoint="PostMessage", CallingConvention=CallingConvention.Winapi)]
            public static extern bool PostMessage(IntPtr hWnd, uint msg, uint wParam, uint lParam);

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

            const uint WM_KEYDOWN = 0x100;
            const uint WM_KEYUP = 0x101;

            const uint VK_CONTROL = 0x11; //virtual key code za Ctrl

     

            //provjerava da li je proces startovan
            private bool IsProcessStarted(string processName)
            {

                foreach (Process clsProcess in Process.GetProcesses())
                {
                    if (clsProcess.ProcessName.Contains(processName))
                    {
                        return true;
                    }

                }

                return false;
            }

            private void button1_Click(object sender, EventArgs e)
            {
                if (IsProcessStarted("notepad") == true)
                {
                    try
                    {
                        Process[] procs = Process.GetProcessesByName("notepad");

                        foreach (Process proc in procs)
                        {
                            if (proc.MainWindowTitle == "Untitled - Notepad")
                            {
                                IntPtr hWnd = FindWindowEx(proc.MainWindowHandle, IntPtr.Zero, "edit", null);
                              
                    
                                PostMessage(hWnd, WM_KEYDOWN, VK_CONTROL, 0);   //pritiska Ctrl
                                PostMessage(hWnd, WM_KEYDOWN, VkKeyScan('S'), 0);  //pritiska 'S'

                                PostMessage(hWnd, WM_KEYUP, VkKeyScan('S'), 0);        //otpusta Ctrl
                                PostMessage(hWnd, WM_KEYUP, VK_CONTROL, 0);        //otpusta 'S'
                           

                              
                            }
                        }
                    }
                    catch
                    {
                        MessageBox.Show("Greska!", "Upozorenje!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }

                else
                {
                    MessageBox.Show("Notepad nije starovan", "Upozorenje!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }


            }

       }

    međutim ni ovo ne radi, a vidio sam da nisam jedini kome ovo ne radi. Doduše, svakim klikom dvaput upisuje 's'. Jel ima neko ideju kako da ovo proradi? :) Samo da napomenem, potrebno mi je da ovo radi sa PostMessage jer na taj nacin mogu poslati sekvencu tastera i procesu u pozadini.

     

    Neko? :)

    • Post Points: 7
Page 1 of 1 (1 items) | RSS
Powered by Community Server (Commercial Edition), by Telligent Systems