Здравствуйте, Антонш, Вы писали:
А>программируется апликуха под Windows Mobile 2003
А>пишу на C#
А>для перехвата кнопок "DIAL" и "HANGUP" в примерах MS SDK есть такой код:
А>А>case WM_INITDIALOG:
А> SHMENUBARINFO mbi;
А> SHCreateMenuBar(&mbi)
А> SendMessage(mbi.hwndMB, SHCMBM_OVERRIDEKEY, VK_TTALK /* кнопка позвонить */,
А> MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY,
А> SHMBOF_NODEFAULT | SHMBOF_NOTIFY));
А>
А>mbi — содается менюбар (зачем-то) а потом (зачем-то туда еще и мессага посылается). Ну ладно, хрен бы с ней, значит именно туда и надо.
А>Вот. После этого можно ловить кнопки управления звонками сразу из приложения. Через WM_HOTKEY (в lparam код клавиши).
А>Блин. КАК НА C# сделать?!!!
А>А>//**********************************************************
А>[DllImport("user32", CharSet = CharSet.Auto)]
А>private static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
А>//**********************************************************
А>//---------------------------------
А>SendMessage(
А>this.
А>, SHCMBM_OVERRIDEKEY, VK_TTALK, MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY,
А>SHMBOF_NODEFAULT | SHMBOF_NOTIFY));
А>//---------------------------------
А>
А>Блин, а слать-то некому! Ни одного Handle нету.
А>Вот хочу нечто так сделать. Этот код посылает мессагу в контрол, например:
А>А>[DllImport("user32", CharSet = CharSet.Auto)]
А>private static extern int SendMessage(IntPtr hWnd, int msg, int wParam, ref CHARFORMAT2 lParam);
А>private void SetSuperScript()
А>{
А> CHARFORMAT2 fmt=new CHARFORMAT2();
А> fmt.cbSize = Marshal.SizeOf(fmt);
А> fmt.dwMask = CFM_SUPERSCRIPT;
А> fmt.dwEffects = CFE_SUPERSCRIPT;
А> SendMessage(this.richTextBox1.Handle, EM_SETCHARFORMAT, SCF_SELECTION, ref fmt);
А>}
А>
Встала та же задача сегодня. И вот что гугль нашел
http://forums.devbuzz.com/m_38708/tm.htm
Спасибо Пете

Как оказалось, эта на задача на шарпе решается очень просто.
Вот мой несколько переделанный код:
using System;
using System.Text;
using System.Data;
using System.Drawing;
using System.Collections;
using System.Windows.Forms;
using System.ComponentModel;
using System.Collections.Generic;
using Microsoft.WindowsCE.Forms;
using System.Runtime.InteropServices;
namespace HardKeys
{
public enum KeyModifiers
{
None = 0,
Alt = 1,
Control = 2,
Shift = 4,
Windows = 8,
Modkeyup = 0x1000,
}
public enum KeysHardware : int
{
Hardware1 = 114, /*Talk*/
Hardware2 = 115, /*End*/
#region Other Code Key
/*
Code Key
13 Action
37 Left
38 Up
39 Right
40 Down
48 to 57 0 to 9
112 Menu 1 Left
113 Menu 2 Right
114 Talk (Green button)
115 End (Red Button)
91 Home
27 Back
121 Record
128 Flip
129 Power
117 Vol Up
118 Vol down
119 *
120 #
*/
#endregion
}
public partial class Form1 : Form
{
myMessageWindow messageWindow;
public Form1()
{
InitializeComponent();
this.messageWindow = new myMessageWindow(this);
IntPtr hWnd = this.messageWindow.Hwnd;
RegisterHKeys.RegisterRecordKey(hWnd);
}
private void menuItem1_Click(object sender, EventArgs e)
{
MessageBox.Show("Start menu pressed");
}
public void ButtonPressed(int button)
{
switch (button)
{
case (int)KeysHardware.Hardware1:
MessageBox.Show("Green Button pressed!");
break;
case (int)KeysHardware.Hardware2:
MessageBox.Show("Red Button pressed!");
break;
}
}
}
public class myMessageWindow : MessageWindow
{
public const int WM_HOTKEY = 0x0312;
Form1 mainform;
public myMessageWindow(Form1 example)
{
this.mainform = example;
}
protected override void WndProc(ref Message msg)
{
switch (msg.Msg)
{
case WM_HOTKEY:
mainform.ButtonPressed(msg.WParam.ToInt32());
return;
}
base.WndProc(ref msg);
}
}
public class RegisterHKeys
{
#region P/Invoke declarations
[DllImport("coredll.dll", SetLastError = true)]
public static extern bool RegisterHotKey(
IntPtr hWnd, // handle to window
int id, // hot key identifier
KeyModifiers Modifiers, // key-modifier options
int key // virtual-key code
);
[DllImport("coredll.dll")]
private static extern bool UnregisterFunc1(KeyModifiers modifiers, int keyID);
#endregion
public static void RegisterRecordKey(IntPtr hWnd)
{
KeyModifiers mod = KeyModifiers.Modkeyup;
UnregisterFunc1(mod, (int)KeysHardware.Hardware1);
RegisterHotKey(hWnd, (int)KeysHardware.Hardware1, mod, (int)KeysHardware.Hardware1);
UnregisterFunc1(mod, (int)KeysHardware.Hardware2);
RegisterHotKey(hWnd, (int)KeysHardware.Hardware2, mod, (int)KeysHardware.Hardware2);
}
}
}
Замечу только, что выполняется это по .net 2.0. Под 1.0 не проверял (т.е., под VM2003 может не пойти).
Не забудь добавить в референсы Microsoft.WindowsCE.Forms.