Heelp! Как получить Handle текущей формы? (+)
От: Антонш  
Дата: 15.06.06 09:33
Оценка:
программируется апликуха под 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' — Хитрик Денис
Heelp! Как получить Handle текущей формы? (+)
От: Аноним  
Дата: 15.06.06 10:18
Оценка:
Form.ActiveForm.ActiveControl.Handle
Deny everything...


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Спасибо!!!!!!!!!!! но .. :( не работает.
От: Антонш  
Дата: 15.06.06 10:39
Оценка:
Здравствуйте, Virus Quartirus, Вы писали:
VQ>Form.ActiveForm.ActiveControl.Handle

вот так он на эмуляторе выглядит


http://www.tinypic.ru/media/20060615145328_413.jpg


соотв. это просто форма без контролов.

Form.ActiveForm.ActiveControl.Handle и вариации на эту тему типа this.ActiveForm итд завершаются ошибкой при компиляции, потому что ActiveForm отсутствует в классе.

наверно на C# не получиццо я уже так чувствую

Может подскажете, что не так?
Re[2]: кажись сделал (вот так можно?!)
От: Антонш  
Дата: 15.06.06 11:27
Оценка:
    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);
Re[2]: кажись сделал (вот так можно?!)
От: Аноним  
Дата: 15.06.06 12:09
Оценка:
Не обратил внимания на то что у вас Compact Framework
Посмотрите лучше в сторону GetForegroundWindow() — это то что вам нужно.
Deny everything...


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[3]: и это не пашет. Не знаете почему?
От: Антонш  
Дата: 15.06.06 12:14
Оценка:
на любом из 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;
            }
Re[3]: спасибо! :) а как сэмулировать Instance и Resources н
От: Антонш  
Дата: 15.06.06 13:42
Оценка:
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# ??? Вот гадство какой вышло, не, ну вообще опущение матки

Все спасибо, если прочитали. Это я так, крик в пустоту. Сам уже вижу, что дело тухло надо идти ....
Re: Heelp! Как получить Handle текущей формы? (+)
От: dev_cdd Украина  
Дата: 11.04.07 14:25
Оценка: 3 (1)
Здравствуйте, Антонш, Вы писали:

А>программируется апликуха под 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.
Re[2]: Heelp! Как получить Handle текущей формы? (+)
От: ralfeus  
Дата: 10.06.07 18:31
Оценка:
Здравствуйте, dev_cdd, Вы писали:

_>Вот мой несколько переделанный код:


Мне этот код сильно помог Правда возникла другая проблема — кнопки диктофона и камеры не регистрируются. Причем как-то странно. Кнопка диктофона диктофон уже не запускает, но и моя программа на нее не реагирует. А кнопка камеры запускает камеру, но и у мне приходит сообщение, причем код кнопки 59. Хотя когда запускал пример p/invoke из MSDN, коды кнопок диктофона и камеры были 193 и 194 соответственно. Что я пропустил?
Re[3]: Heelp! Как получить Handle текущей формы? (+)
От: ralfeus  
Дата: 10.06.07 18:54
Оценка:
Ага, нашел. MSDN говорит, что все hardware кнопки идут с MOD_WIN. Правда непонятно, как определить, кроме экспериментального пути, какую кнопку они считают hardware, а какую — нет. У меня вышло, что только кнопки диктофона и камеры — hardware. И что интересно — при нажатии кнопки камеры перед кодом 194 показывается и код 59... Что бы это значило?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.