|
would you elaborate on it a little? sorry I'm a bit new to windows programming
thanks
|
|
|
|
|
Have a look in the MSDN.
You call SetWindowsHookEx() with a pointer to a function that you supply. Windows will then call this function every time something mouse-related happens, giving you the HWND that the event is for, where the mouse is on screen, etc.
Since there may be more than one program listening for these mouse events, you need to make sure that you pass the event on, by calling CallNextHookEx().
he he he. I like it in the kitchen! - Marc Clifton (on taking the heat when being flamed)
Awasu v0.4a[^]: A free RSS reader with support for Code Project.
|
|
|
|
|
thanks for the pointer, now I still have some problem of getting it to work,
I have the following callback procedure that tries to show the mouse position
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lparam){
MOUSEHOOKSTRUCT* mousehook=(MOUSEHOOKSTRUCT*)lparam;
POINT p=mousehook->pt;
char temp[20];
sprintf(temp,"mouse position is %d %d",p.x,p.y);
MessageBox(hWnd,temp,"",MB_OK);
return 0;
}
and I did SetWindowsHookEx(WH_MOUSE, 0,hInstance,0); but MouseProc was never been called for some reason, what did I do wrong, the following is my code in detail:
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmdLine, int Cmd) {
MSG msg;
// Setup and register the window class;
WNDCLASS wClass;
wClass.style =CS_HREDRAW|CS_VREDRAW;
wClass.lpfnWndProc =WindowProcedure; // callback-function;
wClass.cbClsExtra =0;
wClass.cbWndExtra =0;
wClass.hInstance =hInstance;
wClass.hIcon =LoadIcon(hInstance,IDI_APPLICATION);
wClass.hCursor =LoadCursor(NULL,IDC_ARROW);
wClass.hbrBackground =(HBRUSH)(COLOR_WINDOW+3);
wClass.lpszMenuName =NULL;
wClass.lpszClassName =WINDOWNAME;
RegisterClass(&wClass);
// Create the window and store the handle;
hWnd = CreateWindow(WINDOWNAME, // class name;
WINDOWNAME, // window name;
WS_OVERLAPPEDWINDOW, // window style;
CW_USEDEFAULT, CW_USEDEFAULT, // starting position (x,y);
320, 240, // width and height;
NULL, // parent handle;
NULL, // menu handle;
hInstance, // instance handle;
NULL); // other parameters;
// Check if window creation failed; otherwise show and update;
if(hWnd==NULL) return FALSE;
else {
ShowWindow (hWnd, Cmd);
UpdateWindow(hWnd);
}
HOOKPROC hookproc;
//static HINSTANCE hinstDLL;
static HHOOK hhook;
SetWindowsHookEx(WH_MOUSE, 0,hInstance,0);
// Message loop;
while(GetMessage(&msg,NULL,0,0)) {
TranslateMessage(&msg);
DispatchMessage (&msg);
}
return msg.wParam;
}
|
|
|
|
|
I was actually playing with this stuff the other day and couldn't get it work like this either I had to pass in the current thread ID when setting the hook i.e. call GetCurrentThreadId(). So it should work OK as long as everything is in the one thread, which it is for me. If you really want a global hook or for this work for multiple threads, you're on your own!
BTW, I wouldn't call MessageBox() inside your hook procedure. This function is going to get called a *lot*, from deep inside Windows, and it's probably not going to like you trying to display a dialog box. Log it to a file instead,
he he he. I like it in the kitchen! - Marc Clifton (on taking the heat when being flamed)
Awasu v0.4a[^]: A free RSS reader with support for Code Project.
|
|
|
|
|
thanks, that worked, but now I have a seg fault due to the HHOOK i m passing to SetWIndowsHookEx, the following is what I have, I simply create a new HHOOK, is this wrong?
what is the HHOOK for? I read the msdn doc on it but still kind of fuzzy, thanks.
static HHOOK hhook;
SetWindowsHookEx(WH_MOUSE, hookproc,hInstance,GetCurrentThreadId());
|
|
|
|
|
sorry a correct to my previous post, when I say HHOOK, I meant HOOKPROC
|
|
|
|
|
Go back and read my original post. The crash is probably happening because you're not calling CallNextHookEx().
he he he. I like it in the kitchen! - Marc Clifton (on taking the heat when being flamed)
Awasu v0.4a[^]: A free RSS reader with support for Code Project.
|
|
|
|
|
I put CallNextHookEx(0,nCode,wParam,lparam); in my callback function MouseProc, but it still crashed. Actually how do I obtain the first argument to CallNextBookEx inside MouseProc, the first argument is a handle to the current hook?
thanks
|
|
|
|
|
Since there may be more than 1 program wanting to receive these events, Windows keeps a list of everyone who is interested in receiving them. When you register for these events by calling SetWindowsHookEx(), the return value is a handle for the next person in the list. This is what you pass into CallNextHookEx() so that Windows can let him know about the event as well. He is then responsible for passing it on to the next guy and so on until everyone has received the event.
he he he. I like it in the kitchen! - Marc Clifton (on taking the heat when being flamed)
Awasu v0.4a[^]: A free RSS reader with support for Code Project.
|
|
|
|
|
yes, my question was how to obtain the HOOKPROC that points to the current hookproc in my callback function in order to pass it to CallNextHookEx
CallNextHookEx(currentHookProc,nCode,wParam,lparam);
thanks
|
|
|
|
|
If you call SetCapture, you'll get notification of the next mouse click and your window will recieve all mouse move messages until that click occurs.
Christian
No offense, but I don't really want to encourage the creation of another VB developer.
- Larry Antram 22 Oct 2002
C# will attract all comers, where VB is for IT Journalists and managers - Michael
P Butler 05-12-2002
Again, you can screw up a C/C++ program just as easily as a VB program. OK, maybe not
as easily, but it's certainly doable. - Jamie Nordmeyer - 15-Nov-2002
|
|
|
|
|
if I select from the inserted items(Properties->Data)
the MessageBox() shows the selected item
but when I enter text(item) to the EditBox of the Combo at run time (I want it shown on MessageBox too), the MessageBox is empty. Help me with this please.
the piece of code is:
void CComboView::OnButton1()
{
// TODO: Add your control notification handler code here
int x;
if (x=m_ComboCtrl.GetCurSel() == CB_ERR)
{
m_ComboCtrl.GetWindowText((LPSTR)(LPCSTR) m_Combostr, x);
}
else
{
m_ComboCtrl.GetLBText(x, m_Combostr);
}
MessageBox(m_Combostr, "Simple");
}
|
|
|
|
|
Have you try this?
void CComboView::OnButton1() <br />
{<br />
CString strText;<br />
<br />
m_ComboCtrl.GetWindowText(strText);<br />
if(!strText.IsEmpty())<br />
MessageBox(strText, "Simple");<br />
}
HTH,
K.
One small village of indomitable geeks still holds out against the invaders. And life is not easy for the managers legionaries who garrison the fortified camps of Microsoftum, Javum, Ceplumplum and Vebasum
|
|
|
|
|
hi,
I'm developing ATL ActiveX DLL that used by ASP/VBScript client.
This server uses VARIANT as a parameter input :
HRESULT UseThis([in] VARIANT StringParam, [out, retval] long *ret);<br />
<br />
STDMETHODIMP CObj::UseThis(VARIANT StringParam, long *ret)<br />
{<br />
*ret = 1;<br />
<br />
if((StringParam.vt & VT_ARRAY) && (StringParam.vt & VT_BSTR))<br />
{ <br />
SAFEARRAY *pString = StringParam.parray;<br />
BSTR *bstrArray;<br />
CComBSTR bstrRet;<br />
SafeArrayAccessData(pString, (void**)&bstrArray);<br />
<br />
for(ULONG i = 0; i < pString->rgsabound->cElements; i++)<br />
{<br />
bstrRet = bstrArray[i]; <br />
}<br />
SafeArrayUnaccessData(pString);<br />
SafeArrayDestroy(pString);<br />
<br />
*ret = 0;<br />
}<br />
<br />
return S_OK;<br />
}
When I try to use the function from VB client it OK, but when used from ASP/VBScript client it just FAILED !
VBscript client running on IIS:
Dim obj<br />
Dim ret<br />
Dim strParam(2)<br />
<br />
Set obj = Server.CreateObject("MyATL.Obj") <br />
<br />
strParam(0) = "We"<br />
strParam(1) = "love"<br />
strParam(2) = "COM" <br />
<br />
ret = obj.UseThis(strParam)<br />
<br />
Response.Write "Result is : " & ret<br />
<br />
Set obj = Nothing
Thank u very very much in advance . Any advice, help and suggestions strongly aprreciated.
Regards.
|
|
|
|
|
My initial suspicion is that if it runs fine in VB, but not in a script, that the problem might actually be in the script, not the COM server. I have had headaches debugging scripts, so are you sure execution is reaching obj.UseThis(strParam) without any errors?
|
|
|
|
|
hi,
thanx for ur reply.
I'm very sure it reach obj.UseThis(strParam) but with error.
In ASP I cannot declare variable like Dim strParam(2) as String .
regards.
|
|
|
|
|
Ah yes, a script would give you a SafeArray of Variants which contain BSTRs, not simply an array of BSTRs as with VB. Sorry I didn't notice that.
|
|
|
|
|
Here is my situation, I am using GetDiskFreeSpaceEx to grab drive information from mulitple servers across the network. When for some reason or another that the server is down/unavailable, it can take GetDiskFreeSpaceEx up to 60-180 seconds to "TimeOut". Does anyone know how to change the time out value or how I should go about implementing some timeout code?
Environment VC6
Platform writing for: NT4, W2K, XP
Thanks in advance.
|
|
|
|
|
Hi guys,
is there anybody who has examples of W2K power management/power options?? I would like to know how to implement functions like "stand by", "hiberate", etc. Thanks in advance.
|
|
|
|
|
I remember that there is a Windows API to immplement your wanted function.I am sorry that I had forgot the function name ,maybe "ShutdownWindows",you can search it in MSDN.microsoft.com
I am I,Who is who,I am who,Who am I
|
|
|
|
|
Hi,
I created an instance of my CFrameWnd-derived class with:
CRuntimeClass* pRuntimeClass=RUNTIME_CLASS(CMainWindow);
CObject* pObject=pRuntimeClass->CreateObject();
ASSERT(pObject->IsKindOf(RUNTIME_CLASS(CMainWindow)));
CMainWindow* mainWindow=(CMainWindow*)pObject;
How can I destroy this object at the end of my application?
delete mainWindow does obviously not work. Is there maybe a function similar to CreateObject() which destroys it?
Thank you
|
|
|
|
|
|
Thank you for your reply.
I also thought that the window would automatically get destroyed, but in debug mode it tells me that it detected memory leaks (the CFrameWnd and its toolbar)
|
|
|
|
|
IMO the automatic memory leak detection detects more than is there.
Christian
No offense, but I don't really want to encourage the creation of another VB developer.
- Larry Antram 22 Oct 2002
C# will attract all comers, where VB is for IT Journalists and managers - Michael
P Butler 05-12-2002
Again, you can screw up a C/C++ program just as easily as a VB program. OK, maybe not
as easily, but it's certainly doable. - Jamie Nordmeyer - 15-Nov-2002
|
|
|
|
|
In debug mode I checked if the destructor is called, and it is not called.
|
|
|
|
|