[WinAPI] getMenu() i getSubMenu()

0

Witam. Mam pytanie, jak powinna działać funkacja getMenu() ?
Jako parametr przysyłam jej uchwyt okna i zwraca 0. Jeżeli jako parametr podam jej uchwyt menu zdobyty troche w inny sposób, zwraca poprawną wartość, czyli defakto tą samą co w argumencie. Czyli takie działanie jest bezsensu. Podobnie jest z funkcją getSubMenu() - jeżeli wstawiam jej jako argument uchwyt do menu pobraną w inny sposób i tak zwraca mi zero. PRzesyłam kod. Czy ktoś wie co robie nie tak ?

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

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        IntPtr uchwytOkna;
        IntPtr uchwytMenu;
        IntPtr uchwytSubMenu;



        [DllImport("user32.dll", SetLastError = true)]
        private static extern IntPtr FindWindowEx(IntPtr parent, IntPtr previousChild, string className, string title);

        [DllImport("user32.dll", SetLastError = true)]
        private static extern int FindWindow(string nazwaKlasy, string nazwaOkna);

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

        [DllImport("user32.dll")]
        private static extern IntPtr GetMenu(IntPtr uchwyt);

        [DllImport("user32.dll")]
        private static extern IntPtr GetSubMenu(IntPtr uchwyt, int cos);


        private void button1_Click(object sender, EventArgs e)
        {
            uchwytOkna = (IntPtr)FindWindow(null, textBox1.Text);
            textBox2.Text = uchwytOkna.ToString();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            IntPtr uchwutMenu = GetMenu(uchwytOkna);
            textBox3.Text = uchwytMenu.ToString();
        }
    }
}

0

Nie masz tego w opisie API?

The GetMenu function retrieves the handle of the menu assigned to the given window.

HMENU GetMenu(
    HWND  hWnd	// handle of window  
   );

Czyli podajesz uchwyt do okna (z FindWindow() np.), dostajesz uchwyt do menu.
Jak dostajesz zero, to znaczy, że okienko nie ma podpiętego menu. ;) Do czego to potrzebujesz?

0

pracuje nad automatyzacją testów apliikacji okienkowych. Zrobiłem mały programik testowy, który ma podpięte menu, jednak getmenu() wciąż zwraca zero. Nie wiem jak dojść co może być tego przyczyną, pomyślałem że może będziecie wiedzieć co jest nie tak, gdyż ja z winAPI nie miałem zbyt wiele do czynienia dotąd.

1

Nie wiem jak dojść co może być tego przyczyną, pomyślałem że może będziecie wiedzieć co jest nie tak, gdyż ja z winAPI nie miałem zbyt wiele do czynienia dotąd.

Nic pewnego, ale tego menu nie tworzysz przez winAPI tylko używając narzędzi .NET (prawda?) - wcale nie jest takie oczywiste jak ona traktuje kontrolnę menu.

Edit: taki na przykład resucore hacker "nie widzi" kontrolek .NET na formie (zasoby windows .res i .rc vs zasoby .NET .resx). No cóż, będziesz to musiał zrobić w inny sposób. Na przykład po ludzku, za pomocą narzędzi platformy, zamiast mieszać w to natywne funkcje i system operacyjny.

foreach (Control c in Controls)
{
    MenuStrip menu;
    if ((menu = c as MenuStrip) != null) MessageBox.Show("Znalazłem menu " + menu.Text + "!");
}
0

moze byc. Jutro sprawdze jak smiga bo dzis juz nie mam na to siły. Dzięki ;)

0

a no właśnie. Rzecz ma się tak, że potrzebuje dostać się do menu innego programu. A docelowo to menu ma być kontrolką telerika, nie wiem czy coś może być na rzeczy, ale może być jeszcze inaczej niż w przypadku NETa pewnie ....

1 użytkowników online, w tym zalogowanych: 0, gości: 1