программируется апликуха под 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);
}
11.04.07 18:36: Перенесено модератором из '.NET' — Хитрик Денис
Здравствуйте, Virus Quartirus, Вы писали:
VQ>Form.ActiveForm.ActiveControl.Handle
вот так он на эмуляторе выглядит
http://www.tinypic.ru/media/20060615145328_413.jpg
соотв. это просто форма без контролов.
Form.ActiveForm.ActiveControl.Handle и вариации на эту тему типа this.ActiveForm итд завершаются ошибкой при компиляции, потому что ActiveForm отсутствует в классе.
наверно на C# не получиццо

я уже так чувствую
Может подскажете, что не так?
class WinAPI
{
//--------------------------------------------
[DllImport("coredll.dll")]
private static extern IntPtr SetCapture(IntPtr hWnd);
//--------------------------------------------
[DllImport("coredll.dll")]
private static extern IntPtr GetCapture();
//--------------------------------------------
public static IntPtr GetHWnd(Control ctrl)
{
IntPtr hOldWnd = GetCapture();
ctrl.Capture = true;
IntPtr hWnd = GetCapture();
ctrl.Capture = false;
SetCapture(hOldWnd);
return hWnd;
}
}
....
public Form1()
{
InitializeComponent();
//---------------------------------
IntPtr hWnd = WinAPI.GetHWnd(this);
//SendMessage( ??? , 1, 1, 1);
на любом из SendMessage вылетает игзепшон ("MissingMethodException" — это всё его описание!)
Вроде параметры все передаются правильные, не нулевые.
public Form1()
{
InitializeComponent();
IntPtr hWnd = WinAPI.GetHWnd(this);
UInt16 wMode = (UInt16)(SHMBOF_NODEFAULT | SHMBOF_NOTIFY);
int iLparam = MAKELPARAM(wMode, wMode);
try
{
SendMessage(hWnd, 0x0111/*WM_COMMAND*/, 0, 0);
SendMessage(hWnd, 0x0012/*WM_QUIT*/, 0, 0);
SendMessage(hWnd, SHCMBM_OVERRIDEKEY, VK_TEND, iLparam);
}
catch (Exception e)
{
int t = 0;
}
VQ>Посмотрите лучше в сторону GetForegroundWindow() — это то что вам нужно.
Угу. Спасибо. HWND я получил. Но заодно и получил по мордасам от C#.
Воросец такой, а как-нибудь можно съэмулировать INSTANCE & RESOURCES синтетически?
Оказывается перед ПОЛНОЦЕННОЙ работой надо создать так называемый MenuBar. Я от такого идиотизма уже обплевался

Получается на C# вообще не поднять нормальные приложения на WinMobile.
Поясню. Нейтив вызова к "WINSHELLAPI BOOL SHCreateMenuBar(SHMENUBARINFO *pmbi);" нету!
пришлось:
[StructLayout(LayoutKind.Sequential)]
public struct SHMENUBARINFO
{
public UInt32 cbSize;
public IntPtr hwndParent;
public UInt32 dwFlags;
public UInt32 nToolBarId;
public UInt32 hInstRes;
public UInt32 nBmpId;
public UInt32 cBmpImages;
public IntPtr hwndMB;
public UInt32 clrBk;
}
//--------------------------------
[DllImport("aygshell.dll")]
private static extern bool SHCreateMenuBar(ref SHMENUBARINFO mbi);
Ну вот а тут дальше наврочивается как снежный ком: вот эти мемберы нельзя проициализировать нормально.
hInstRes
nToolBarId
На сях (API) это вот так выглядит:
int WINAPI WinMain(
HINSTANCE hInstance, - инстанс берется отсюда
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow
memset(&mbi, 0, sizeof(SHMENUBARINFO));
mbi.cbSize = sizeof(SHMENUBARINFO);
mbi.hwndParent = hwnd;
mbi.nToolBarId = IDR_SPMENU;
mbi.hInstRes = hInstance;
mbi.nBmpId = 0;
mbi.cBmpImages = 0;
if (SHCreateMenuBar(&mbi) == 0)
return FALSE;
IDR_SPMENU MENU - код меню в ресурсах берется отсюда
BEGIN
POPUP "Menu"
BEGIN
MENUITEM "Exit", ID_MENU_EXIT
END
END
а вот на c# я НУ НИКАК!!!!!!! не смогу получить IDR_SPMENU и hInstance.
Так что, заканчивать с C# ??? Вот гадство какой вышло, не, ну вообще опущение матки
Все спасибо, если прочитали. Это я так, крик в пустоту. Сам уже вижу, что дело тухло

надо идти ....
Здравствуйте, Антонш, Вы писали:
А>программируется апликуха под 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.
Здравствуйте, dev_cdd, Вы писали:
_>Вот мой несколько переделанный код:
Мне этот код сильно помог

Правда возникла другая проблема — кнопки диктофона и камеры не регистрируются. Причем как-то странно. Кнопка диктофона диктофон уже не запускает, но и моя программа на нее не реагирует. А кнопка камеры запускает камеру, но и у мне приходит сообщение, причем код кнопки 59. Хотя когда запускал пример p/invoke из MSDN, коды кнопок диктофона и камеры были 193 и 194 соответственно. Что я пропустил?
Ага, нашел. MSDN говорит, что все hardware кнопки идут с MOD_WIN. Правда непонятно, как определить, кроме экспериментального пути, какую кнопку они считают hardware, а какую — нет. У меня вышло, что только кнопки диктофона и камеры — hardware. И что интересно — при нажатии кнопки камеры перед кодом 194 показывается и код 59... Что бы это значило?