5 out of 6 rated this helpful - Rate this topic

SetCursor function

Applies to: desktop apps only

Sets the cursor shape.

Syntax

HCURSOR WINAPI SetCursor(
  __in_opt  HCURSOR hCursor
);

Parameters

hCursor [in, optional]

Type: HCURSOR

A handle to the cursor. The cursor must have been created by the CreateCursor function or loaded by the LoadCursor or LoadImage function. If this parameter is NULL, the cursor is removed from the screen.

Return value

Type: HCURSOR

The return value is the handle to the previous cursor, if there was one.

If there was no previous cursor, the return value is NULL.

Remarks

The cursor is set only if the new cursor is different from the previous cursor; otherwise, the function returns immediately.

The cursor is a shared resource. A window should set the cursor shape only when the cursor is in its client area or when the window is capturing mouse input. In systems without a mouse, the window should restore the previous cursor before the cursor leaves the client area or before it relinquishes control to another window.

If your application must set the cursor while it is in a window, make sure the class cursor for the specified window's class is set to NULL. If the class cursor is not NULL, the system restores the class cursor each time the mouse is moved.

The cursor is not shown on the screen if the internal cursor display count is less than zero. This occurs if the application uses the ShowCursor function to hide the cursor more times than to show the cursor.

Examples

For an example, see Displaying a Cursor.

Requirements

Minimum supported client

Windows 2000 Professional

Minimum supported server

Windows 2000 Server

Header

Winuser.h (include Windows.h)

Library

User32.lib

DLL

User32.dll

See also

Reference
CreateCursor
GetCursor
LoadCursor
LoadImage
SetCursorPos
ShowCursor
Conceptual
Cursors
Other Resources
GetSystemMetrics

 

 

Send comments about this topic to Microsoft

Build date: 2/3/2012

Did you find this helpful?
(1500 characters remaining)
Community Content Add
Annotations FAQ
cross thread issue
It is true that you need to call SetCursor from the UI thread. Its also true that AttachThreadInput will put the call in the context of the UI thread as suggested above. But apparently the call to AttachThreadInput has the side effect of resetting the timer uses to synthisize the windows double click event. If your (non GUI) thread happens to call AttachThreadInput(guithread, currentthread, TRUE) while the use is click twice you may not see the double click event from windows.
SetCursor from non GUI threads
Calling SetCursor on a non-GUI thread does not appear to work. The simple fix is surrounding the call with AttachThreadInputs of the current thread to the GetForegroundWindow thread. I picked this up from: http://www.codeproject.com/KB/cpp/WaitCursor.aspx example: HWND hWnd = GetForegroundWindow(); DWORD foregroundThreadID = GetWindowThreadProcessId(hWnd, 0); DWORD currentThreadID = GetCurrentThreadId(); AttachThreadInput(foregroundThreadID, currentThreadID, TRUE); SetCursor(hCursor); AttachThreadInput(foregroundThreadID, currentThreadID, FALSE);