как нажать(на некоторое время) клавишу в другой программе
От: BAZOOKAMEGATRON Россия http://jk-simvol.ru/
Дата: 21.04.07 18:43
Оценка:
собственно стоит задача отправлять в другую программу нажатие клавиши (например '[')
System.Windows.Forms.SendKeys не подходит, так так он просто посылает клавищу а мне надо её зажать на неопределённое время =)
подскажите пожалуйста в какую сторону копать, ничего немогу найти
спасибо

23.04.07 13:31: Перенесено модератором из '.NET' — TK
Re: как нажать(на некоторое время) клавишу в другой программ
От: tyger Россия  
Дата: 23.04.07 01:55
Оценка: 2 (1)
Здравствуйте, BAZOOKAMEGATRON, Вы писали:

BAZ>собственно стоит задача отправлять в другую программу нажатие клавиши (например '[')

BAZ>System.Windows.Forms.SendKeys не подходит, так так он просто посылает клавищу а мне надо её зажать на неопределённое время =)
BAZ>подскажите пожалуйста в какую сторону копать, ничего немогу найти

Видими нужно посылать не готовый символ, а WindowMessage KeyDown и код клавиши, а потом KeyUp.
Re: как нажать(на некоторое время) клавишу в другой программ
От: ak_miass Россия  
Дата: 23.04.07 06:13
Оценка: 2 (1)
Здравствуйте, BAZOOKAMEGATRON, Вы писали:

BAZ>собственно стоит задача отправлять в другую программу нажатие клавиши (например '[')

BAZ>System.Windows.Forms.SendKeys не подходит, так так он просто посылает клавищу а мне надо её зажать на неопределённое время =)

keybd_event подойдёт?
Re[2]: как нажать(на некоторое время) клавишу в другой прогр
От: Аноним  
Дата: 23.04.07 07:47
Оценка: 2 (1)
_>keybd_event подойдёт?

Вообще, с этими всеми keybd_event() и mouse_event(), а также с их более новым аналогом — SendInput(), если одна большая проблема. Окно, которому посылаются клавиши, должно быть активно и иметь фокус (это по максимуму). А как минимум это окно должно быть наверху (foreground).

Если есть хендл окна, то лучше передавать сообщения через SendMessage(), PostMessage(), PostThreadMessage(), etc.
Re[3]: как нажать(на некоторое время) клавишу в другой прогр
От: BAZOOKAMEGATRON Россия http://jk-simvol.ru/
Дата: 23.04.07 15:10
Оценка:
спасибо всем
хочу ещё уточнить:
для того чтобы использовать вышенаписанное в c# мне надо использовать напрямую win32 api и "unmanaged code"?
в c# готового и удобного(так сказать) ничего для этого нет?
Re[4]: как нажать(на некоторое время) клавишу в другой прогр
От: _Morpheus_  
Дата: 23.04.07 15:36
Оценка: 2 (1)
Здравствуйте, BAZOOKAMEGATRON, Вы писали:

BAZ>спасибо всем

BAZ>хочу ещё уточнить:
BAZ>для того чтобы использовать вышенаписанное в c# мне надо использовать напрямую win32 api и "unmanaged code"?
BAZ>в c# готового и удобного(так сказать) ничего для этого нет?

нет
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[5]: как нажать(на некоторое время) клавишу в другой прогр
От: BAZOOKAMEGATRON Россия http://jk-simvol.ru/
Дата: 23.04.07 15:46
Оценка:
_M_>нет

спасибо, тогда вопрос снят, дальше как-нибудь сам разберусь =)
Re[6]: как нажать(на некоторое время) клавишу в другой прогр
От: BAZOOKAMEGATRON Россия http://jk-simvol.ru/
Дата: 24.04.07 13:14
Оценка:
вобщем прошу снова мне помочь =)

никак немогу зажать клавишу на длительное время
второй день уже е.. мучаюсь =(
при любых вариантах она просто нажимается а мне нада держать её
посоветуйте что-нибудь пожалуйста

вот немного кода:
public partial class MainForm : Form
{
    const int WM_KEYDOWN = 256;
    const int WM_CHAR = 258;
    const int WM_KEYUP = 257;

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

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern void PostMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

    public MainForm()
    {
        IntPtr hWnd = FindWindow(null, "program name");

        IntPtr t1 = (IntPtr)'[';
        IntPtr nul = IntPtr.Zero;

        PostMessage(hWnd, WM_KEYDOWN, t1, nul);
    //    PostMessage(hWnd, WM_CHAR, t1, nul);
    //    PostMessage(hWnd, WM_KEYUP, t1, nul);

        ...
    }
}
Re[7]: как нажать(на некоторое время) клавишу в другой прогр
От: tyger Россия  
Дата: 25.04.07 04:11
Оценка: 2 (1)
Здравствуйте, BAZOOKAMEGATRON, Вы писали:

BAZ>вобщем прошу снова мне помочь =)


BAZ>никак немогу зажать клавишу на длительное время

BAZ>второй день уже е.. мучаюсь =(
BAZ>при любых вариантах она просто нажимается а мне нада держать её
BAZ>посоветуйте что-нибудь пожалуйста

Я бы предложил в таком сулчае сделать тестовое приложение и проэмулировать ситуацию, т.е. зажимать клавишу и смотреть какие WindowsMessages прилетают, а потом их повторить...

BAZ>вот немного кода:

BAZ>
BAZ>public partial class MainForm : Form
BAZ>{
<skipped>

BAZ>        PostMessage(hWnd, WM_KEYDOWN, t1, nul);
BAZ>    //    PostMessage(hWnd, WM_CHAR, t1, nul);
BAZ>    //    PostMessage(hWnd, WM_KEYUP, t1, nul);
BAZ>        ...
BAZ>    }
BAZ>}
BAZ>

А при этом у тебя фокус на/с приложения не перемещается случайно? Я думаю что это может повлият...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[8]: как нажать(на некоторое время) клавишу в другой прогр
От: TheThief Россия  
Дата: 25.04.07 10:09
Оценка: 2 (1)
Здравствуйте, tyger, Вы писали:

T>Здравствуйте, BAZOOKAMEGATRON, Вы писали:


BAZ>>вобщем прошу снова мне помочь =)


BAZ>>никак немогу зажать клавишу на длительное время

BAZ>>второй день уже е.. мучаюсь =(
BAZ>>при любых вариантах она просто нажимается а мне нада держать её
BAZ>>посоветуйте что-нибудь пожалуйста

T>Я бы предложил в таком сулчае сделать тестовое приложение и проэмулировать ситуацию, т.е. зажимать клавишу и смотреть какие WindowsMessages прилетают, а потом их повторить...


Его даже создавать не надо, достаточно воспользоваться Spy++, эта тулза вместе со студией уже много лет живет. Натравить ее можно непосредственно на жертву твоей проги, она тебе лог по всем мессагам пришедшим окну выдаст.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[9]: как нажать(на некоторое время) клавишу в другой прогр
От: BAZOOKAMEGATRON Россия http://jk-simvol.ru/
Дата: 25.04.07 12:27
Оценка:
T>>Я бы предложил в таком сулчае сделать тестовое приложение и проэмулировать ситуацию, т.е. зажимать клавишу и смотреть какие WindowsMessages прилетают, а потом их повторить...

TT>Его даже создавать не надо, достаточно воспользоваться Spy++, эта тулза вместе со студией уже много лет живет. Натравить ее можно непосредственно на жертву твоей проги, она тебе лог по всем мессагам пришедшим окну выдаст.


спасибо, проблемму решил, посмотрев что отправляется программе при реальном нажатии кнопки на клавиатуре

public partial class MainForm : Form
{
    const int WM_KEYDOWN = 256;

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

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern void PostMessage(IntPtr hWnd, int msg, Keys k);

    public MainForm()
    {
        IntPtr hWnd = FindWindow(null, "program name");
        Keys k = Keys.Oem4;    //это кнопка '['
        PostMessage(hWnd, WM_KEYDOWN, k);
        ...
    }
}


но осталась одна проблема, при реальном нажатии этой кнопки на клавиатуре, программное нажатие пропадает =)
Re[10]: как нажать(на некоторое время) клавишу в другой прог
От: tyger Россия  
Дата: 26.04.07 08:10
Оценка:
Здравствуйте, BAZOOKAMEGATRON, Вы писали:


BAZ>но осталась одна проблема, при реальном нажатии этой кнопки на клавиатуре, программное нажатие пропадает =)

Ну а ты как хотел? Ты ведь когда конпку отпускаешь окну прилетает WindowsMessage KyUp...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[11]: как нажать(на некоторое время) клавишу в другой прог
От: BAZOOKAMEGATRON Россия http://jk-simvol.ru/
Дата: 26.04.07 10:26
Оценка:
BAZ>>но осталась одна проблема, при реальном нажатии этой кнопки на клавиатуре, программное нажатие пропадает =)
T>Ну а ты как хотел? Ты ведь когда конпку отпускаешь окну прилетает WindowsMessage KyUp...

угу, вставил таймер штоп посылался keyDown периодически

кстати может кто знает как отследить нажата ли клавиша в другой программе? =)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.