views:

231

answers:

1

alt text

Hi guys,

I'm developing an Windows Mobile 6.5 start menu replacement called JWMD Stuick. Currently, I'm able to detect if the Start Menu is created or destroyed by checking GetWindowLong() API.. Though this does not guarantee if Start Menu is visible or not because other cooked ROM was even if the Start Menu is closed or an app was executed from Start Menu -- the Start Menu GWL still has value.

Do guys have better ways or ideas how to check if Start Menu is Visible?

Thanks.

A: 

I found a way to get the Window Messages using Subclassing.. but am not sure what I'm doing wrong.

subclassing sample can be found here http://blogs.msdn.com/raffael/archive/2008/02/26/subclassing-netcf-applications.aspx

I partially took some of the code provided but am not sure why once the start menu was hooked, it hangs..

here's the code

using System;

using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; using System.Runtime.InteropServices;

namespace DetectWM65StartMenuVisibility { public partial class Form1 : Form { #region DllImport public const int GWL_WNDPROC = (-4); public const int WM_RAFFAEL = 123456789;

    public delegate IntPtr WndProcDelegate(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

    [DllImport("coredll", SetLastError = true)]
    public static extern IntPtr GetWindowLong(IntPtr hWnd, int nIndex);

    [DllImport("coredll", SetLastError = true)]
    public static extern int SetWindowLong(IntPtr hWnd, int nIndex, IntPtr newWndProc);

    [DllImport("coredll", SetLastError = true)]
    public static extern IntPtr CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

    [DllImport("coredll.dll", SetLastError = true)]
    private static extern IntPtr FindWindow(string _ClassName, string _WindowName);

    [DllImport("coredll.dll", SetLastError = true)]
    public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

    [DllImport("coredll.dll", SetLastError = true)]
    private static extern bool SetForegroundWindow(IntPtr hWnd);
    #endregion DllImport

    private static IntPtr oldWndProc = IntPtr.Zero;
    private static WndProcDelegate newWndProc;
    private static IntPtr hWndTarget = IntPtr.Zero;
    private string strClassName = "MSSTARTMENU";
    private string strWindowName = "Start";

    uint WM_ACTIVATE = 0x06;
    uint WM_KILLFOCUS = 0x08;

    public Form1()
    {
        InitializeComponent();
        InitializeControls();
        InitializeControlEvents();
    }

    void InitializeControls()
    {
        this.Size = new Size(100,100);
        this.Location = new Point(0, (Screen.PrimaryScreen.WorkingArea.Height - this.Height)-Screen.PrimaryScreen.WorkingArea.Top);
    }

    void InitializeControlEvents()
    {
        this.Load += new EventHandler(Form1_Load);
        this.Closing += new CancelEventHandler(Form1_Closing);

        btnStartHook.Click += new EventHandler(btnStartHook_Click);
        btnUnhook.Click += new EventHandler(btnUnhook_Click);
    }

    void btnUnhook_Click(object sender, EventArgs e)
    {
        int success = SetWindowLong(hWndTarget, GWL_WNDPROC, oldWndProc);

        Application.Exit();
    }

    void btnStartHook_Click(object sender, EventArgs e)
    {
        hWndTarget = FindWindow(strClassName, strWindowName);
        System.Diagnostics.Debug.WriteLine("hwndtarget: " + hWndTarget.ToString());
        if (hWndTarget == IntPtr.Zero) { return; }

        newWndProc = new WndProcDelegate(NewWndProc);
        oldWndProc = GetWindowLong(hWndTarget, GWL_WNDPROC);
        int success = SetWindowLong(hWndTarget, GWL_WNDPROC, Marshal.GetFunctionPointerForDelegate(newWndProc));
    }

    void Form1_Closing(object sender, CancelEventArgs e)
    {
        int success = SetWindowLong(hWndTarget, GWL_WNDPROC, oldWndProc);
    }

    void Form1_Load(object sender, EventArgs e)
    {
    }

    //SUBCLASSING PROCEDURE
    public IntPtr NewWndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam)
    {
        if (msg == WM_ACTIVATE)
        {
            System.Diagnostics.Debug.WriteLine("StartMenu Activated");
        }
        else if (msg == WM_KILLFOCUS)
        {
            System.Diagnostics.Debug.WriteLine("StartMenu Deactivated");
        }

        System.Diagnostics.Debug.WriteLine("msg: " + msg.ToString());

        return CallWindowProc(oldWndProc, hWnd, msg, wParam, lParam);
    }
}

}

can somebody help me?

Nullstr1ng