Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.07.2012, 14:58   #1
AlienNation
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 85
По умолчанию Глобальный хук

для глобального хука использую такой код:

Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace com
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        [DllImport("user32.dll")]
        static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc callback, IntPtr hInstance, uint threadId);

        [DllImport("user32.dll")]
        static extern bool UnhookWindowsHookEx(IntPtr hInstance);

        [DllImport("user32.dll")]
        static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, int wParam, IntPtr lParam);

        [DllImport("kernel32.dll")]
        static extern IntPtr LoadLibrary(string lpFileName);

        private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);

        const int WH_KEYBOARD_LL = 13; // Номер глобального LowLevel-хука на клавиатуру
        const int WM_KEYDOWN = 0x100; // Сообщения нажатия клавиши

        private LowLevelKeyboardProc _proc = hookProc;

        private static IntPtr hhook = IntPtr.Zero;

        public void SetHook()
        {
            IntPtr hInstance = LoadLibrary("User32");
            hhook = SetWindowsHookEx(WH_KEYBOARD_LL, _proc, hInstance, 0);
        }

        public static void UnHook()
        {
            UnhookWindowsHookEx(hhook);
        }

        public static IntPtr hookProc(int code, IntPtr wParam, IntPtr lParam)
        {
            if (code >= 0 && wParam == (IntPtr)WM_KEYDOWN)
            {
                int vkCode = Marshal.ReadInt32(lParam);
                //////ОБРАБОТКА НАЖАТИЯ
                myfunc(this); // ошибка
                return (IntPtr)1;
            }
            else
                return CallNextHookEx(hhook, code, (int)wParam, lParam);
        }

        private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            // убираем хук
            UnHook();

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            SetHook();
        }

        public static void myfunc(Form form){

            //Создаем объект типа Graphics.
            Graphics g;
            Image img = Image.FromFile("1.bmp");
            //Приписываем g к нашему окну.
            g=form.CreateGraphics();
            //Выводим на g рисунок.
            g.DrawImage(img, 0, 0);
        }

    }
}
хук как бы выводит на форму картинку и не важно активна форма или нет, проблема в том что я не могу обратиться к форме при таком хуке, ошибка гласит:

Цитата:
Ошибка 1 Ключевое слово "this" не может использоваться в инициализаторах статических свойств, методов или полей
AlienNation вне форума Ответить с цитированием
Старый 29.07.2012, 18:57   #2
@SSV
Пользователь
 
Регистрация: 22.07.2012
Сообщений: 16
По умолчанию

PHP код:
 using System.Runtime.InteropServices;
    public 
partial class Form1 Form
    
{
        public 
Form1()
        {
            
InitializeComponent();
        }

     
        private 
void Form1_Load(object senderEventArgs e)
        {
            
Hook.SetHook();
        }

        public  
void myfunc()
        {
            
MessageBox.Show("Hook сработал!!!");
        }

        private 
void Form1_FormClosing(object senderFormClosingEventArgs e)
        {
            
// убираем хук
            
Hook.UnHook();

        }

    }

    class 
Hook
    
{
         [
DllImport("user32.dll")]
        static 
extern IntPtr SetWindowsHookEx(int idHookLowLevelKeyboardProc callbackIntPtr hInstanceuint threadId);

        [
DllImport("user32.dll")]
        static 
extern bool UnhookWindowsHookEx(IntPtr hInstance);

        [
DllImport("user32.dll")]
        static 
extern IntPtr CallNextHookEx(IntPtr idHookint nCodeint wParamIntPtr lParam);

        [
DllImport("kernel32.dll")]
        static 
extern IntPtr LoadLibrary(string lpFileName);

        private 
delegate IntPtr LowLevelKeyboardProc(int nCodeIntPtr wParamIntPtr lParam);

        const 
int WH_KEYBOARD_LL 13// Номер глобального LowLevel-хука на клавиатуру
        
const int WM_KEYDOWN 0x100// Сообщения нажатия клавиши

        
private static LowLevelKeyboardProc _proc hookProc;

        private static 
IntPtr hhook IntPtr.Zero;

        public static 
void SetHook()
        {
            
IntPtr hInstance LoadLibrary("User32");
            
hhook SetWindowsHookEx(WH_KEYBOARD_LL_prochInstance0);
        }

        public static 
void UnHook()
        {
            
UnhookWindowsHookEx(hhook);
        }

        public static 
IntPtr hookProc(int codeIntPtr wParamIntPtr lParam)
        {
            if (
code >= && wParam == (IntPtr)WM_KEYDOWN)
            {
                
int vkCode Marshal.ReadInt32(lParam);
                
//////ОБРАБОТКА НАЖАТИЯ
                
Form1 f1 = new Form1();
                
f1.myfunc(); // ошибка
                
return (IntPtr)1;
            }
            else
                return 
CallNextHookEx(hhookcode, (int)wParamlParam);
        }
    } 
Правда у всех своя, а истину не знает ни кто.
@SSV вне форума Ответить с цитированием
Старый 29.07.2012, 19:00   #3
@SSV
Пользователь
 
Регистрация: 22.07.2012
Сообщений: 16
По умолчанию

или так........................
Цитата:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication14
{
using System.Runtime.InteropServices;
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}


private void Form1_Load(object sender, EventArgs e)
{
Hook.SetHook();
}

public static void myfunc()
{
MessageBox.Show("Hook сработал!!!");
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// убираем хук
Hook.UnHook();

}

}

class Hook
{
[DllImport("user32.dll")]
static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc callback, IntPtr hInstance, uint threadId);

[DllImport("user32.dll")]
static extern bool UnhookWindowsHookEx(IntPtr hInstance);

[DllImport("user32.dll")]
static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, int wParam, IntPtr lParam);

[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary(string lpFileName);

private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);

const int WH_KEYBOARD_LL = 13; // Номер глобального LowLevel-хука на клавиатуру
const int WM_KEYDOWN = 0x100; // Сообщения нажатия клавиши

private static LowLevelKeyboardProc _proc = hookProc;

private static IntPtr hhook = IntPtr.Zero;

public static void SetHook()
{
IntPtr hInstance = LoadLibrary("User32");
hhook = SetWindowsHookEx(WH_KEYBOARD_LL, _proc, hInstance, 0);
}

public static void UnHook()
{
UnhookWindowsHookEx(hhook);
}

public static IntPtr hookProc(int code, IntPtr wParam, IntPtr lParam)
{
if (code >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
//////ОБРАБОТКА НАЖАТИЯ

Form1.myfunc();
return (IntPtr)1;
}
else
return CallNextHookEx(hhook, code, (int)wParam, lParam);
}
}
}

Правда у всех своя, а истину не знает ни кто.
@SSV вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Слетает глобальный хук. evgeny_sh Win Api 0 02.07.2012 21:20
Глобальный хук клавиатуры. Horus92 Win Api 2 14.10.2010 22:51
Глобальный хук Умед Общие вопросы Delphi 1 02.08.2010 11:04
Глобальный хук на клаву rem37 Win Api 7 03.05.2009 01:25
Глобальный хук на мышь не глобальный О_о JTG Общие вопросы Delphi 3 05.06.2008 17:41