Страница 1 из 1

Помогите с GetKeyboardLayout

Добавлено: 18 сен 2010, 10:44
BTGStranger
Подскажите пожалуйста, почему не пашет.

Код: Выделить всё

Process [] ps = Process.GeyProcessByName("taskmgr");
Process p = Process.GetProcessById(ps[0].Id);
Console.WriteLine(GetKeyboardLayout(pid)>>16);
Пытаюсь получить раскладку в чужом окне, скажем в диспетчере, но возвращает всегда одно значение.
Раскладку в своем окне GetKeyboardLayout(0) определяет исправно .

Re: Помогите с GetKeyboardLayout

Добавлено: 18 сен 2010, 12:36
Duncon
GeyProcessByName

Re: Помогите с GetKeyboardLayout

Добавлено: 18 сен 2010, 23:56
Eugie
1. GetKeyboardLayout() принимает не processId, a threadId - идентификатор потока (http://msdn.microsoft.com/en-us/library ... 85%29.aspx)
2. GetKeyboardLayout() - функция Win32 API, ее нужно вызывать через механизм PInvoke.

Ниже приведен пример опроса раскладок клавиатуры для заданного процесса. Внешний цикл пробегает по копиям процесса, внутренний - по потокам, т.к. у каждого в принципе может быть своя раскладка. В качестве теста можно запустить 2 копии Блокнота, в одном переключить раскладку. Другой интересный пример - процесс devenv (Visual Studio), многопоточный с разными раскладками.

Код: Выделить всё

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace Sample
{
    class Program
    {
        [DllImport("user32.dll")]
        public static extern IntPtr GetKeyboardLayout(uint idThread);

        static void Main(string[] args)
        {
            Console.Write("Имя процесса: ");
            string pname = Console.ReadLine();
            Process[] ps = Process.GetProcessesByName(pname);
            foreach (Process p in ps)
            {
                Console.WriteLine("Process instance Id: {0}", p.Id);
                foreach (ProcessThread pt in p.Threads)
                {
                    uint tid = (uint)pt.Id;
                    Console.WriteLine("  ThreadId: {0} KeyboardLayoutId: {1}", tid, GetKeyboardLayout(tid).ToInt32() >> 16);
                }
            }
        }
    }
}

Re: Помогите с GetKeyboardLayout

Добавлено: 21 сен 2010, 15:25
BTGStranger
threadId!
В каком-то интернет справочнике видел именно processId - это и сбило столку. Но теперь все работает.
Спасибо, Eugie!