получить заголовок окна из setwindowhook

2

в первую очередь, не уверен, что Im делает это правильно (setSetWindowsHookEx). Я хочу получать уведомления обо всех окнах, созданных из процесса (стороннее приложение), и получить заголовок, чтобы узнать, есть ли это окно, с которым я хочу что-то сделать, если он затем получит свою позицию и разместит на нем некоторые формы, а также SetWinEventHook, поэтому, если это окно перемещается, формы будут оставаться в окне. Как я могу получить заголовок из нового окна?

 public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    public enum HookType : int
    {
        WH_JOURNALRECORD = 0,
        WH_JOURNALPLAYBACK = 1,
        WH_KEYBOARD = 2,
        WH_GETMESSAGE = 3,
        WH_CALLWNDPROC = 4,
        WH_CBT = 5,
        WH_SYSMSGFILTER = 6,
        WH_MOUSE = 7,
        WH_HARDWARE = 8,
        WH_DEBUG = 9,
        WH_SHELL = 10,
        WH_FOREGROUNDIDLE = 11,
        WH_CALLWNDPROCRET = 12,
        WH_KEYBOARD_LL = 13,
        WH_MOUSE_LL = 14
    }
    public enum ShellEvents : int {
        HSHELL_WINDOWCREATED = 1,
        HSHELL_WINDOWDESTROYED = 2,
        HSHELL_ACTIVATESHELLWINDOW = 3,
        HSHELL_WINDOWACTIVATED = 4,
        HSHELL_GETMINRECT = 5,
        HSHELL_REDRAW = 6,
        HSHELL_TASKMAN = 7,
        HSHELL_LANGUAGE = 8,
        HSHELL_ACCESSIBILITYSTATE = 11
    }


    private delegate int HookProc(int code, IntPtr wParam, IntPtr lParam);
    static IntPtr hHook;


    HookProc myCallbackDelegate;



    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr SetWindowsHookEx(HookType hookType, HookProc lpfn, IntPtr hMod, uint dwThreadId);

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    static extern int CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);


    [System.Runtime.InteropServices.DllImport("user32.dll")]
    static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

    [System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
    public static extern IntPtr GetModuleHandle(string lpModuleName);
   //const int HSHELL_WINDOWCREATED = 1;

    public int MyCallbackFunction(int nCode, IntPtr wParam, IntPtr lParam)
    {

        if (Convert.ToInt32 (nCode) >0 )//HSHELL_WINDOWCREATED)
        {

            //MessageBox.Show("hola");
        }

       //Is this correct or should be on a else?

        return CallNextHookEx(hHook, nCode, wParam, lParam);
    }


    [DllImport("kernel32.dll")]
    static extern uint GetCurrentThreadId();
    private void Form1_Load(object sender, EventArgs e)
    {
        myCallbackDelegate = new HookProc(MyCallbackFunction);
       processHandle);



        hHook = SetWindowsHookEx(HookType.WH_SHELL, myCallbackDelegate, (IntPtr)0,GetCurrentThreadId());

    }
    [DllImport("user32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool UnhookWindowsHookEx(IntPtr hhk);
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        UnhookWindowsHookEx(hHook);
    }
}
Теги:
setwindowshookex

1 ответ

0
Лучший ответ

SetWindowsHookEx - это функция, которая дает право устанавливать крючок (локальный не глобальный, за исключением мыши и клавиатуры))

иметь заголовок окна, вы можете использовать, что ссылка Список процессов

  • 0
    Да, я пробовал это, но мне это не нравилось, потому что мне приходилось все время зацикливаться, и я не знал, как заставить форму перестать думать даже с потоками, но я думаю, что я мог бы вместо того, чтобы зацикливаться все время, просто делать это, когда окно создано, спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню